这是我要实现的目标:我有一个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服务器的连接?如何确定?
谢谢。
答案 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