Axios配置代理发送请求报EPROTO SSL版本号错误如何解决
Axios 配置代理请求HTTPS站点报SSL版本号错误修复
报错信息
AxiosError: write EPROTO 1C3B0000:error:0A00010B:SSL routines:ssl3_get_record:wrong version number:c:\ws\deps\openssl\openssl\ssl\record\ssl3_record.c:355:
错误根因
原生Axios的内置代理逻辑存在缺陷,通过HTTP代理访问HTTPS目标站点时,不会自动发起CONNECT请求建立SSL隧道,而是直接将加密的HTTPS报文发送给HTTP代理端口,代理返回普通HTTP协议响应后,OpenSSL无法将HTTP报文识别为合法SSL/TLS记录,最终抛出版本号不匹配错误。
复现代码
const axios = require('axios') axios({ url: 'https://medal.tv', method:'GET', proxy: { protocol: 'http', host: 'xxx', port: 3000, auth: { username: 'xxx', password: 'xxx' } }, }).then(e => console.log(e.data)).catch(e => console.log(e))
修复方法
优先使用手动指定HTTPS代理Agent的方案,兼容性最好:
- 安装依赖包
npm install https-proxy-agent - 改写请求逻辑,移除原有
proxy配置项,替换为手动创建的代理Agent:const axios = require('axios') const { HttpsProxyAgent } = require('https-proxy-agent') // 拼接代理地址,认证信息直接写入URL即可 const proxyAgent = new HttpsProxyAgent('http://账号:密码@代理地址:3000') axios({ url: 'https://medal.tv', method: 'GET', httpsAgent: proxyAgent }).then(e => console.log(e.data)).catch(e => console.log(e))
其他可选方案
- 如果你的代理服务本身监听HTTPS端口,可将原
proxy配置中的protocol字段改为https,同时对应修改port为代理的HTTPS端口即可,该方案仅适用于支持HTTPS协议的代理,普通公网HTTP代理不适用。
注意事项
- 禁止同时配置
proxy字段和自定义httpsAgent,二者会产生配置冲突导致代理不生效 - 测试环境如果出现证书校验失败问题,可在axios配置中添加
rejectUnauthorized: false临时关闭证书校验,生产环境不建议使用该配置 - 无认证的代理直接将代理地址写为
http://host:port格式即可
内容的提问来源于stack exchange,提问作者Laxuzer
相关产品推荐
相关产品推荐

