0

这是我想要实现的目标:我有一个 TCP 客户端需要连接到我们的服务器应用程序,但我需要通过 HTTPS 完成流量。据我所知,它可以通过反向(或正向?)代理来完成,如下所示:

TCP client <--- HTTPS ---> myproxy.com:443 <------> tcp server app that listen port 7999

我使用以下虚拟主机配置成功创建了一个没有 SSL的代理:

<VirtualHost *:80>
    ServerName myproxy.com
    SetEnv proxy-nokeepalive 1
    ProxyErrorOverride off
    ProxyRequests On
    ProxyBadHeader Ignore
    ProxyVia Full
    AllowCONNECT 80 443 7999
</VirtualHost>

(我不确定这些参数中的任何一个是否是不必要的)

使用该虚拟主机,我可以像这样启动与服务器的 tcp 连接:

telnet myproxy.com 80

> Connected to myproxy.com.

CONNECT myproxy.com:7999 HTTP/1.1
Host: myproxy.com:7999

> HTTP/1.0 200 Connection Established
> Proxy-agent: Apache/2.4.18 (Ubuntu)

一旦我添加 SSL 并使用端口 443,我就无法再连接:

<IfModule mod_ssl.c>
<VirtualHost *:443>
    ServerName myproxy.com
    SetEnv proxy-nokeepalive 1
    ProxyErrorOverride off
    ProxyRequests On
    ProxyBadHeader Ignore
    ProxyVia Full
    AllowCONNECT 80 443 7999

    SSLProxyEngine On
    SSLEngine On
    SSLCertificateFile...
</VirtualHost>
</IfModule>

如果我尝试连接到这个虚拟主机,我会得到以下信息:

telnet myproxy.com 443

> Connected to myproxy.com.

CONNECT myproxy.com:7999 HTTP/1.1
Host: myproxy.com:7999

> Connection closed by foreign host.

我在做什么错,这只能通过使用端口 443 吗?在键入此内容时,我尝试了启用 SSL 的端口 80(与我的上一个虚拟主机相同,但使用<VirtualHost *:80>, 并且它似乎可以工作。我与 TCP 服务器的连接是否以这种方式安全?我怎么能确定呢?

谢谢你。

4

1 回答 1

1

您首先要做的是创建一个 HTTP 代理并向它发出一个普通的 CONNECT 请求。这按预期工作。

然后您所做的是启用 SSL 以连接到此代理,但再次发出普通的 CONNECT。由于您明确配置到代理的连接应该是 SSL 而不是普通的,因此这如预期的那样失败了。这意味着代理期望连接以 TLS 握手开始(即客户端发送的 ClientHello),而不是一些纯文本 HTTP 请求。

如果你想用 HTTPS 连接到代理,那么你不能使用简单的 telnet,因为 telnet 只说普通的 TCP。您需要改用支持 TLS 的客户端,例如openssl s_client. 然后你会得到类似的东西

$ openssl s_client -connect myproxy:443
CONNECTED
...
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : ...
---
CONNECT myproxy:7999 HTTP/1.0

HTTP/1.0 200 Connection established
于 2018-06-22T12:30:31.083 回答