通过https代理发送https请求,但返回“未知协议:openssl”错误

时间:2018-07-20 09:46:43

标签: node.js ssl https proxy request

如果我通过“ HTTP”代理请求“ HTTP”地址,一切都很好

    const rq = require('request-promise'); 
    try {
    let res = rq({
        url: 'http://xxxx',
        timeout: TIME_OUT,
        gzip: true,
        proxy: 'http://112.25.60.32:8080'
    });
    res.then(res => {
        console.log('res');
        console.log(res);
    }).catch(err => {
        console.log(err);
    });
} catch (error) {
    console.log(error);
}

但如果通过“ https”代理请求“ https”地址,它将返回“未知协议”

  

RequestError:错误:无法建立隧道套接字,原因=写入EPROTO 101057795:error:140770FC:SSL例程:SSL23_GET_SERVER_HELLO:未知协议:openssl \ ssl \ s23_clnt.c:827:

try {
    let res = rq({
        url: 'https://ipinfo.io/', //  https address
        timeout: TIME_OUT,
        gzip: true,
        rejectUnauthorized: false,
        proxy: 'https://149.56.109.24:3128' //  https proxy
    });
    res.then(res => {
        console.log('res');
        console.log(res);
    }).catch(err => {
        console.log(err);
    });
} catch (error) {
    console.log(error);
}

起初,我认为代理地址存在问题。但是相同的代理地址在python请求模块中可以正常工作

  

python代码

import requests, os
os.environ['HTTP_PROXY'] = '112.25.60.32:8080'
os.environ['HTTPS_PROXY'] = '149.56.109.24:3128'
try:
    text = requests.get('https://ipinfo.io/').text # request https address
except Exception as e:
    print(e)
    print('connect failed')
print(text) 
# it works fine!  {
  "ip": "149.56.109.24:3128", 
  "hostname": "181.ip-158-69-206.net",
  "city": "Montreal",
  "region": "Quebec",
  "country": "CA",
  "loc": "45.5000,-73.5833",
  "postal": "H3A",
  "org": "AS16276 OVH SAS"
}
# The returned 'ip' information is the 'https' proxy address.

在StackOverflow中发现了类似的问题。有人回答这是端口问题。

  

这里是链接StackOverflow

但是我认为这不是端口问题,因为当我使用提琴手的代理时,它就可以了!

  

这是我关于提琴手的配置

enter image description here

  

代码(由提琴手提供)

try {
  let res = rq({
    url: 'https://ipinfo.io/',
    timeout: TIME_OUT,
    gzip: true,
    rejectUnauthorized: false,
    proxy: 'http://127.0.0.1:8888' // through fiddler
  });
  res
    .then(res => {
      console.log('res');
      console.log(res); // it works!!
    })
    .catch(err => {
      console.log(err);
    });
} catch (error) {
  console.log(error); 
}

但是,根据上述代码,代理更改为“ 149.56.109.24:3128”(不带提琴手)仍将报告“ 未知协议:openssl \ ssl \ s23_clnt.c:827 ”错误

那出了什么问题?我还没有解决。

1 个答案:

答案 0 :(得分:1)

   proxy: 'https://149.56.109.24:3128' //  https proxy

HTTP代理将处理HTTP和HTTPS。通过简单地连接到HTTP代理,发出CONNECT请求以建立到服务器的隧道,然后将连接升级到该隧道内的TLS来处理HTTPS,从而产生端到端HTTPS。

您配置的是通过HTTPS访问代理本身,本质上是在HTTPS隧道内要求HTTPS。代理很可能不支持此功能,即使用http://访问代理而不使用https://