You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NodeJS创建HTTPS客户端遇ERR_TLS_CERT_ALTNAME_INVALID错误求助

解决Node.js HTTPS客户端的ERR_TLS_CERT_ALTNAME_INVALID错误

嘿,这个错误我之前在本地调试HTTPS服务时也踩过坑!本质是你的Node.js客户端在验证服务器证书时,发现证书的**Subject Alternative Name(SAN,备用名称)**里没有包含你请求的localhost域名,所以触发了安全验证失败。

核心原因

现在的TLS/HTTPS规范里,服务器证书必须通过SAN字段指定允许访问的域名/IP,光靠证书里的CN(Common Name)字段已经不被Node.js等现代工具认可了。如果你的服务器证书是自签的,大概率是生成的时候没配置SAN,导致localhost不在证书的允许列表里。

解决方案分步来:

1. 先确认证书的SAN配置

用OpenSSL命令查看你的服务器证书(server_cert.pem,也就是服务端使用的证书):

openssl x509 -in server_cert.pem -text -noout

查找输出里的Subject Alternative Name字段,如果看不到这一行,或者里面没有DNS:localhost,那就是问题所在。

2. 重新生成带SAN的服务器证书(推荐,适合开发/生产)

你需要重新生成包含localhost的自签证书,步骤如下:

  • 先创建一个OpenSSL配置文件,比如命名为server_san.cnf:
    [req]
    distinguished_name = req_distinguished_name
    req_extensions = v3_req
    prompt = no
    
    [req_distinguished_name]
    CN = localhost
    
    [v3_req]
    keyUsage = keyEncipherment, dataEncipherment
    extendedKeyUsage = serverAuth
    subjectAltName = @alt_names
    
    [alt_names]
    DNS.1 = localhost
    DNS.2 = 127.0.0.1 # 如果需要用IP访问服务,就加上这行
    
  • 然后用这个配置生成私钥和证书请求(CSR):
    openssl req -new -newkey rsa:2048 -nodes -keyout server_private_key.pem -out server.csr -config server_san.cnf
    
  • 最后用你的根证书(root_cert.pem)签名生成服务器证书:
    openssl x509 -req -in server.csr -CA root_cert.pem -CAkey root_private_key.pem -CAcreateserial -out server_cert.pem -days 365 -extensions v3_req -extfile server_san.cnf
    
  • 替换服务端的旧证书为新生成的server_cert.pem,重启HTTPS服务器。

3. 临时绕过验证(仅开发环境!生产绝对禁用)

如果只是本地快速测试,不想重新生成证书,可以在客户端的options里添加rejectUnauthorized: false,关闭证书验证。但这会跳过所有TLS安全检查,非常不安全,只能临时用:

var options = {
  hostname: 'localhost',
  port: 8445,
  path: '/authorisation/getIt', // 注意这里路径开头要加/,原代码里的路径可能会导致请求错误
  method: 'GET',
  ca: fs.readFileSync('root_cert.pem', 'utf8'),
  key: fs.readFileSync('consumer_private_key.pem', 'utf8'),
  cert: fs.readFileSync('consumer_cert.pem', 'utf8'),
  passphrase: 'password',
  rejectUnauthorized: false, // 仅开发用,生产必须删除
  headers: { 
    "Content-Type": "application/json", 
    "Content-Length": Buffer.byteLength(body) 
  } 
};

另外注意:原代码里的path是'authorisation/getIt',建议改成'/authorisation/getIt',避免路径解析错误。

最后提醒

生产环境一定要使用配置正确SAN的合法证书(比如从可信CA机构申请),绝对不能依赖rejectUnauthorized: false来绕过验证,这会导致你的请求面临中间人攻击的风险。

内容的提问来源于stack exchange,提问作者K Kolluru

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:22:54