- NodeJs的介绍及使用
- Node.js核心模块概览
- NodeJs-Assertion Testing
- NodeJs-Asynchronous Context Tracking
- NodeJs-async_hooks
- NodeJs-Buffer
- Node.js- C++ Addons
- Node.js-C++ Addons Node-API
- NodeJs-C++ Embedder API
- Node.js-Child Process
- NodeJs-Cluster
- Node.js-命令行选项
- Node.js-Console
- Node.js-Corepack
- Node.js-Crypto
- NodeJs-Debugger
- NodeJs-Diagnostics Channel
- NodeJs-DNS
- NodeJs-Domain
- NodeJs-Errors
- NodeJs-Events
- NodeJs-File system(一)
- NodeJs-File system(二)
- NodeJs-File system(三)
- NodeJs-Globals
- NodeJs-HTTP
- NodeJs-HTTP/2
- NodeJs-HTTPS
- NodeJs-Inspector
- NodeJs-Internationalization
- NodeJs-Modules CommonJS modules、ECMAScript modules、node:module、Packages、TypeScript
- NodeJs-Net
- NodeJs-OS
- NodeJs-path
- NodeJs-Performance Hooks
- NodeJs-Permissions
- NodeJs-process
- NodeJs-punycode
- Node.js-querystring
- NodeJs-Readline
- NodeJs-REPL
- NodeJs-Report
- NodeJs-Single Executable Applications
- NodeJs-SQLite
- NodeJs-Stream
- NodeJs-String Decoder
- NodeJs-Test runner
- NodeJs-Timers
- NodeJs-TLS/SSL
- NodeJs-Trace events
- NodeJs-TTY
- NodeJs-UDP/datagram
- NodeJs-URL
- NodeJs-Utilities
- NodeJs-V8
- NodeJs-VM
- NodeJs-WASI
- NodeJs-Web Crypto API
- NodeJs Web Streams API
- NodeJs Worker threads
- NodeJs-Zlib
- NodeJs-Single Executable Applications
NodeJs-TLS/SSL
class TLS/SSLNode.js 的 TLS/SSL
模块 (tls
) 提供了传输层安全性(Transport Layer Security, TLS)和安全套接字层(Secure Sockets Layer, SSL)的实现,用于加密客户端与服务端之间的数据传输。它是 Node.js 中构建安全网络通信应用程序的关键模块。
TLS
和 SSL
的核心功能包括创建安全的 TCP 连接、设置客户端与服务器之间的安全通信、证书管理、双向验证等。
以下是 TLS/SSL
模块的详细使用、各个属性及方法的详细说明。
1. 引入 tls
模块
在使用 tls
模块之前,需要在代码中引入该模块:
const tls = require('tls');
2. 创建 TLS/SSL 服务端
通过 tls.createServer()
创建一个 TLS 服务器,允许客户端通过加密的方式连接。
语法:
const server = tls.createServer(options[, secureConnectionListener]);
-
options
: 配置选项对象。key
: 服务端私钥,用于加密通信。cert
: 服务端证书,用于认证服务器的身份。ca
: 受信任的证书颁发机构证书列表(可选),用于验证客户端证书。requestCert
: 布尔值,指示是否要求客户端提供证书(可选,默认为false
)。rejectUnauthorized
: 布尔值,是否拒绝未经授权的客户端连接(默认为true
)。
-
secureConnectionListener
: 连接建立时的回调函数。
示例:
const fs = require('fs');
const tls = require('tls');
// 读取密钥和证书文件
const options = {
key: fs.readFileSync('server-key.pem'),
cert: fs.readFileSync('server-cert.pem'),
ca: [fs.readFileSync('ca-cert.pem')], // 可选
requestCert: true, // 请求客户端证书
rejectUnauthorized: true // 拒绝未授权的客户端
};
// 创建 TLS 服务器
const server = tls.createServer(options, (socket) => {
console.log('Client connected', socket.authorized ? 'authorized' : 'unauthorized');
// 数据传输
socket.write('Welcome!\n');
socket.setEncoding('utf8');
socket.pipe(socket);
});
server.listen(8000, () => {
console.log('TLS server listening on port 8000');
});
3. 创建 TLS/SSL 客户端
通过 tls.connect()
创建一个 TLS 客户端,用于连接到 TLS 服务器。
语法:
const client = tls.connect(port[, host][, options][, secureConnectionListener]);
port
: 服务器的端口号。host
: 服务器主机名(默认为'localhost'
)。options
: 客户端配置选项。key
: 客户端私钥(可选)。cert
: 客户端证书(可选)。ca
: 受信任的证书颁发机构列表,用于验证服务器证书(可选)。rejectUnauthorized
: 是否拒绝未经授权的服务器连接(默认为true
)。
示例:
const fs = require('fs');
const tls = require('tls');
// 读取客户端密钥和证书
const options = {
key: fs.readFileSync('client-key.pem'),
cert: fs.readFileSync('client-cert.pem'),
ca: [fs.readFileSync('ca-cert.pem')], // 用于验证服务端
rejectUnauthorized: true // 拒绝未经授权的服务端
};
// 创建客户端并连接到服务器
const client = tls.connect(8000, 'localhost', options, () => {
console.log('Connected to server', client.authorized ? 'authorized' : 'unauthorized');
// 发送消息
client.write('Hello, server!');
});
// 接收服务端消息
client.on('data', (data) => {
console.log('Received:', data.toString());
client.end();
});
4. 双向认证
TLS
支持客户端和服务器之间的双向认证(Mutual Authentication),即服务器验证客户端证书,客户端也验证服务器证书。这种认证方式提高了通信的安全性,确保双方身份都被验证。
通过在 tls.createServer()
和 tls.connect()
方法中设置 requestCert: true
和提供 ca
证书列表即可实现双向认证。
5. TLS Socket
当使用 tls.createServer()
或 tls.connect()
时,会创建一个 TLSSocket
,它是 net.Socket
的扩展,提供了额外的与加密相关的方法和属性。
5.1 tlsSocket.getPeerCertificate([detailed])
返回连接对方的证书。可选参数 detailed
控制返回的证书信息的详细程度。
const cert = tlsSocket.getPeerCertificate();
console.log(cert);
5.2 tlsSocket.authorized
布尔值,指示对方的证书是否被授权。
if (tlsSocket.authorized) {
console.log('Connection is authorized');
} else {
console.log('Connection is unauthorized:', tlsSocket.authorizationError);
}
5.3 tlsSocket.setMaxSendFragment(size)
设置最大传输数据片段的大小。
tlsSocket.setMaxSendFragment(16384); // 设置最大传输片段大小为16KB
5.4 tlsSocket.encrypted
布尔值,指示当前连接是否已加密。
6. 证书管理
在 TLS
通信中,证书的管理非常重要。证书用于身份验证,私钥用于加密和解密通信数据。
6.1 生成自签名证书
你可以使用 OpenSSL
创建一个自签名证书用于测试和开发:
# 生成私钥
openssl genrsa -out server-key.pem 2048
# 生成证书请求文件
openssl req -new -key server-key.pem -out server-csr.pem
# 使用私钥签署证书,有效期为1年
openssl x509 -req -in server-csr.pem -signkey server-key.pem -out server-cert.pem -days 365
同样的过程也适用于客户端证书。
6.2 证书颁发机构 (CA) 验证
在生产环境中,通常需要通过受信任的证书颁发机构 (CA) 来签署证书,而不是使用自签名证书。
7. TLS/SSL 相关事件
TLSSocket
和 tls.Server
都提供了若干事件,可以帮助开发者更好地处理连接的生命周期和错误。
7.1 secureConnect
当 TLS 连接成功建立时触发。
client.on('secureConnect', () => {
console.log('Secure connection established');
});
7.2 error
当出现任何错误时触发,例如证书验证失败、连接中断等。
server.on('error', (err) => {
console.error('TLS server error:', err);
});
7.3 clientError
当客户端出现错误时,tls.Server
会触发 clientError
事件。
server.on('clientError', (err, socket) => {
console.error('Client error:', err);
socket.end('HTTP/1.1 400 Bad Request\r\n\r\n');
});
8. 加密算法和协议支持
Node.js 中的 TLS
模块支持多个加密算法和 TLS 协议版本。你可以通过 options
对象来控制服务器和客户端支持的加密算法和协议。
8.1 options.ciphers
指定允许使用的加密算法列表。加密算法列表是一个字符串,包含多个加密算法的名称,以 :
分隔。
const options = {
ciphers: 'ECDHE-RSA-AES128-GCM-SHA256:AES128-SHA'
};
8.2 options.secureProtocol
指定使用的 TLS/SSL 协议版本。
const options = {
secureProtocol: 'TLSv1_2_method' // 使用 TLS 1.2
};
常见的协议版本包括:
TLSv1_method
TLSv1_1_method
TLSv1_2_method
TLSv1_3_method
9. 禁用旧协议版本
出于安全考虑,应避免使用已知不安全的协议版本(如 SSLv3
和 TLSv1.0
)。可以通过设置 minVersion
和 maxVersion
来指定允许的最低和最高协议版本。
const options = {
min
Version: 'TLSv1.2', // 最低使用 TLS 1.2
maxVersion: 'TLSv1.3' // 最高使用 TLS 1.3
};
总结
Node.js 的 TLS/SSL
模块为构建安全通信提供了灵活的接口,允许开发者轻松实现安全的网络服务。通过掌握 TLS
的客户端与服务器配置、证书管理、加密算法等内容,你可以确保应用程序的数据传输具有高强度的安全性。