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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 11:26:19