Node.js+Axios POST请求遇SSL遗留协商禁用错误的原因与解决问询
Node.js 18 + Axios 请求出现 EPROTO SSL 错误的原因与解决方案
错误原因
你遇到的EPROTO B8150000:error:0A000152:SSL routines:final_renegotiate:unsafe legacy renegotiation disabled错误,本质是Node.js 18及以上版本默认禁用了不安全的旧版SSL重新协商机制,而目标API服务器仍在使用这种不符合现代安全规范的配置。
Postman 与 Node.js 请求结果差异的原因
Postman的底层SSL客户端配置默认允许旧版SSL重新协商(它依赖的运行环境放宽了安全限制,或是使用了不同的SSL库配置),所以能成功建立连接;而Node.js 18开始严格遵循安全标准,默认拒绝与使用旧版协商机制的服务器通信,因此请求失败。
不推荐的临时解决方案
你找到的修改Axios配置允许旧版连接的方法,虽能解决问题,但会降低请求安全性,禁止在生产环境使用:
import axios from 'axios'; import https from 'https'; import crypto from 'crypto'; // 原始报错的请求代码 function makeRequest(url: string, data: object) { return axios({ url, headers: { Accept: 'application/json', 'Content-Type': 'application/json', }, method: 'POST', data: { some: 'data' }, }); } // 添加旧版SSL支持的修改版代码 const allowLegacyRenegotiationOptions = { httpsAgent: new https.Agent({ // 允许连接使用旧版SSL配置的服务器 secureOptions: crypto.constants.SSL_OP_LEGACY_SERVER_CONNECT, // 若服务器用自签证书可添加此行(同样不安全) // rejectUnauthorized: false, }), }; function makeRequestWithLegacySupport(url: string, data: object) { return axios({ ...allowLegacyRenegotiationOptions, url, headers: { Accept: 'application/json', 'Content-Type': 'application/json', }, method: 'POST', data: { some: 'data' }, }); }
推荐的解决方案
1. 联系API端点所有者更新SSL/TLS配置
这是最安全、最根本的解决方式:
- 要求服务器升级SSL/TLS协议版本,至少使用TLS 1.2及以上
- 禁用旧版SSL重新协商机制,启用符合RFC 5746标准的安全重新协商
- 移除不安全的加密套件,只保留现代安全的套件
2. 测试环境临时替代方案(仅用于测试)
如果是测试环境且无法立即推动服务器升级,除了上述不推荐的方法外,还可以通过环境变量临时放宽Node.js的安全限制:
export NODE_OPTIONS=--openssl-legacy-provider
同样,该方法会降低整体安全级别,绝对不能用于生产环境。
内容的提问来源于stack exchange,提问作者HelloCity
相关产品推荐
相关产品推荐

