如何修复Node.js 17调用Sandbox Bluesnap时unsafe legacy renegotiation disabled报错
根因说明
Node 17默认升级了OpenSSL配置,禁用了不安全的SSL遗留重协商机制,你碰到的报错就是目标站点Bluesnap的沙箱环境还在使用这套已被废弃的不安全重协商逻辑,所以请求被Node默认拦截。你之前配置的rejectUnauthorized: false、NODE_TLS_REJECT_UNAUTHORIZED=0都是用于跳过证书合法性校验,和重协商规则无关,因此不生效。
临时解决方案
方案1:单请求单独配置(更安全,推荐)
在初始化https.Agent时额外添加secureOptions参数,单独给这个请求开放遗留重协商权限:
const https = require('https'); const { constants } = require('crypto'); // 发起请求的部分 fetch( // node-fetch 'https://sandbox.bluesnap.com/services/2/payment-fields-tokens', { agent: new https.Agent({ rejectUnauthorized: false, // 新增以下配置 secureOptions: constants.SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION }), body, // 在其他位置定义 } );
方案2:全局生效配置
如果你的项目里有多处请求需要调用Bluesnap接口,可以在项目入口文件最顶部添加以下代码,全局开放遗留重协商权限:
const { constants } = require('crypto'); process.env.NODE_OPTIONS = `--tls-secure-options=${constants.SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION}`;
注意事项
上述配置仅为临时兼容方案,允许不安全遗留重协商存在中间人攻击风险,等Bluesnap侧完成SSL配置修复后请及时移除相关配置。
内容的提问来源于stack exchange,提问作者Rafael De Leon
相关产品推荐
相关产品推荐

