我尝试使用自己的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握手错误。
有人已经遇到此问题吗? 有些可以帮助我吗?
答案 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.