Node.js TLS 配置生成器
生成 https.createServer 的安全协议和套件选项,附 HSTS 和 HTTP 跳转 HTTPS。
浏览器本地运行 你输入的内容只在本地用 JavaScript 处理,不会上传到 ssl.sh。
TLS 配置生成器的 Node.js 预设生成一个小的 server.js:包含 https.createServer 的 TLS 选项、HSTS 头,以及一个把 HTTP 跳转到 HTTPS 的服务。把选项复制到你的程序里。
示例:中级档
const fs = require('node:fs');
const http = require('node:http');
const https = require('node:https');
const options = {
key: fs.readFileSync('/etc/ssl/example.com/privkey.pem'),
cert: fs.readFileSync('/etc/ssl/example.com/fullchain.pem'),
minVersion: 'TLSv1.2',
ciphers: 'TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305',
honorCipherOrder: false,
ecdhCurve: 'X25519:prime256v1:secp384r1',
};
https.createServer(options, (req, res) => {
res.setHeader('Strict-Transport-Security', 'max-age=63072000; includeSubDomains');
res.end('ok\n');
}).listen(443);
http.createServer((req, res) => {
res.writeHead(301, { Location: 'https://example.com' + req.url });
res.end();
}).listen(80);
用 Express 或 Koa 时,把 app 作为请求处理函数传进去:https.createServer(options, app)。
版本说明
- Node.js 18 及以上(目前所有 LTS 版本)都支持 TLS 1.3 和这些选项。
- 后量子密钥交换写
ecdhCurve: 'X25519MLKEM768:X25519:prime256v1:secp384r1',但只有node -p process.versions.openssl显示 3.5 及以上时才行,否则创建服务器时会抛错。 - 监听 80、443 端口需要 root 或
CAP_NET_BIND_SERVICE权限;很多部署让 Node 监听高位端口,前面放代理。
证书从哪里来
阿里云、腾讯云下载“Nginx”或“其他”格式的证书包,里面的证书文件(已含证书链)给 cert,.key 给 key。只有 PFX 的话,Node 也可以直接用 pfx 和 passphrase 选项加载,或者先用 PFX 转 PEM 转换。
常见错误
cert里只有站点证书:curl 和其他 Node.js 程序会报 unable to verify the first certificate,要用完整证书链。- 跳转地址用了
req.headers.host:攻击者可以伪造 Host 头,像上面那样跳转到你自己的域名。
常见问题
应该让 Node.js 自己处理 TLS 吗?
可以,这里的选项可以直接用于生产。不过很多部署会在前面放 Nginx、负载均衡或 CDN,方便自动续期证书和提供 HTTP/2,那样就在前面那一层配置 TLS。
续期后不重启怎么加载新证书?
ACME 客户端续期后调用 server.setSecureContext() 传入新的 key 和 cert,比如在文件监听或 SIGHUP 处理函数里调用。
我的 Node.js 用的是哪个 OpenSSL?
执行 node -p process.versions.openssl。官方发行的 Node.js 自带 OpenSSL;系统包管理器装的 Node 可能链接系统的 OpenSSL。