TLS 配置生成

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。

资料来源

  1. Node.js tls 模块
  2. Mozilla Server Side TLS