# Node.js HTTPS TLS 配置生成器

> 生成 Node.js https.createServer 的 TLS 选项：minVersion、密码套件、ecdhCurve（含 X25519MLKEM768）和 HSTS。

Source: https://ssl.sh/zh/tools/tls-config-generator/nodejs/
Last updated: 2026-11-10

生成 https.createServer 的安全协议和套件选项，附 HSTS 和 HTTP 跳转 HTTPS。

[TLS 配置生成器](https://ssl.sh/zh/tools/tls-config-generator/)的 Node.js 预设生成一个小的 `server.js`：包含 `https.createServer` 的 TLS 选项、HSTS 头，以及一个把 HTTP 跳转到 HTTPS 的服务。把选项复制到你的程序里。

## 示例：中级档

```javascript
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](https://ssl.sh/zh/tools/ssl-converter/pfx-to-pem/) 转换。

## 常见错误

- **`cert` 里只有站点证书**：curl 和其他 Node.js 程序会报 [unable to verify the first certificate](https://ssl.sh/zh/errors/node-unable-to-verify-leaf-signature/)，要用完整证书链。
- **跳转地址用了 `req.headers.host`**：攻击者可以伪造 Host 头，像上面那样跳转到你自己的域名。


## FAQ

**应该让 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。
