Node.js通过代理发起HTTPS请求时出现SSL wrong version number错误原因咨询
问题:HTTPS代理请求报错SSL wrong version number
错误信息
cause: Error: write EPROTO 085C0000:error:0A00010B:SSL routines:ssl3_get_record:wrong version number:c:\ws\deps\openssl\openssl\ssl\record\ssl3_record.c:355
原代码
const axios = require('axios'); const tunnel = require('tunnel'); const https = require('https'); async function sss() { try { const responsePromise = await axios.request({ url: 'https://api.ipify.org/?format=json', method: 'get', headers: { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36' }, port: 443, proxy: { host: '117.160.250.133', port: 8899 }, }); console.log(await responsePromise); } catch (ex) { console.log(ex); } } sss();
错误原因分析
核心问题是你使用的是HTTP代理,但未通过隧道转发HTTPS请求:
- 当你直接用Axios默认的
proxy配置请求HTTPS站点时,客户端会尝试直接向HTTP代理发送SSL握手请求,但HTTP代理只能处理HTTP协议,会返回HTTP格式的响应。客户端把这个HTTP响应当成SSL数据解析,就会触发"wrong version number"错误。 - 你用HTTP协议+80端口能成功,正好验证了该代理是纯HTTP代理,不支持直接处理SSL流量。
解决办法
使用tunnel库创建HTTPS隧道代理,让代理先建立到目标HTTPS服务器的CONNECT隧道,再通过隧道传输SSL流量。修改后的代码如下:
const axios = require('axios'); const tunnel = require('tunnel'); async function sss() { try { // 创建HTTPS over HTTP隧道代理 const tunnelAgent = tunnel.httpsOverHttp({ proxy: { host: '117.160.250.133', port: 8899 } }); const response = await axios.request({ url: 'https://api.ipify.org/?format=json', method: 'get', headers: { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36' }, httpsAgent: tunnelAgent // 指定使用隧道代理 }); console.log(response.data); } catch (ex) { console.log(ex); } } sss();
补充说明
如果修改后仍然报错,大概率是PubProxy提供的免费代理限制了CONNECT方法(很多免费代理仅允许HTTP请求),需要更换支持CONNECT隧道的代理服务器。
内容的提问来源于stack exchange,提问作者Cost
相关产品推荐
相关产品推荐

