在NodeJS上使用自己的https代理发出SSL握手

时间:2018-10-06 08:40:37

标签: node.js ssl https proxy tls1.2

我尝试使用自己的HTTPS代理工作,并且无法创建我的https服务器,在连接初始化期间,我收到此错误消息“ tlsClientError错误:101057795:错误:1407609B:SSL例程:SSL23_GET_CLIENT_HELLO:https代理请求:openssl \ ssl \ s23_srvr.c:400“。

在节点JS源代码下面:

private runHttpsServer() {
const instance = this;
const cert = fs.readFileSync("./certificate/server.crt", "utf8");
const key = fs.readFileSync("./certificate/key.pem", "utf8");
const options : https.ServerOptions = {
    cert: cert,
    key: key
};
const httpsServer = https.createServer(options, (req, res)=>{
    console.log("Request ...");
    instance.handleRequest.call(instance, req, res);     
});
httpsServer.on("tlsClientError", (err : Error, tlsSocket : TLSSocket)=>{
    console.log("tlsClientError", err.stack);
});
httpsServer.listen(7001);

}

在没有代理的情况下直接浏览到“ https://localhost:7001/”时,没有SSL握手错误。 当我通过代理浏览到其他网站时,出现此SSL握手错误。

有人已经遇到此问题吗? 有些可以帮助我吗?

2 个答案:

答案 0 :(得分:0)

您似乎对代理HTTPS的工作方式有错误的了解。并非客户端将像您假设的那样建立与代理的TLS连接,而是客户端将使用CONNECT方法向代理发送简单的HTTP请求,以使代理建立到目标主机的隧道。然后客户端将将此隧道升级到TLS,从而在客户端和最终服务器之间获得端到端保护。

在线上看起来像这样(确切的消息可能会略有不同-有关详细信息,请参见RFC 2817

 Client ------------------------> Proxy
 - create TCP connection
 - send to proxy:
   > CONNECT google.com:443 HTTP/1.0\r\n
   > \r\n                  

                                  Proxy -----------------------------> Server
                                  - create TCP connection

 Client <------------------------ Proxy
 - send to client
   < HTTP/1.0 200 Connection established\r\n
   < \r\n

 Client <------------------------(Proxy)-----------------------------> Server
   use tunnel from client to server through proxy to
   - make the end-to-end TLS handshake
   - transfer the HTTP messages within the TLS connection 
  

... SSL例程:SSL23_GET_CLIENT_HELLO:https代理请求:...

此错误消息实质上表明您的代理期望TLS握手(ClientHello)的开始,但是收到了https代理请求,即CONNECT ...。您需要修复代理才能正确处理https代理请求,该请求如我所述。

答案 1 :(得分:0)

我也有同样的问题。作为先生史蒂芬·乌尔里希(Steffen Ullrich)回答我们(我和您)对代理HTTPS的工作方式有误。首先,您需要在http中监听事件CONNECTION,然后进行tls握手。在代码中看起来像这样:

#hh3 is a array of length 70
#pp is an zero vector of a specified length
K = 0
compare = np.arange(1, 2, 1e-4)
compare_size = len(compare)

for j in range(compare_size):
     for i in range(no*nos):
        if hh3[i] >= compare[j]:
          pp[K] = pp[K] + 1
        if pp[K] == 0:
          break
      K = K + 1

您可以在Node.js的官方网站上了解它

我的https代理的完整代码可用here.