通过HTTPS代理的TCP连接

时间:2018-06-22 12:04:38

标签: https tcp proxy http-proxy http-tunneling

这是我要实现的目标:我有一个TCP客户端,该客户端需要连接到我们的服务器应用程序,但是我需要通过HTTPS进行通信。据我所知,可以通过以下反向(或转发)代理来完成:

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

我成功使用以下vhost配置创建了没有SSL 的代理:

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

(我不确定这些参数是否是不必要的tbh)

使用该虚拟主机,可以像这样启动与服务器的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来实现吗? 键入此命令时,我尝试在端口80上启用SSL(与我的最后一个虚拟主机相同,但使用<VirtualHost *:80>,并且似乎可以正常工作。我是否以此方式保护了与TCP服务器的连接?如何确定?

谢谢。

1 个答案:

答案 0 :(得分:0)

您首先要做的是创建一个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