如果您对 stunnel 实例的服务器端口执行 HTTP:
client <--- TCP ---> stunnel <--- TCP ---> server
<--- TLS --->
<------------- HTTP -------------->
它将几乎与使用 HTTPS 完全一样,但不完全是因为客户端仍然认为自己使用基于 TCP 的 HTTP。例如,浏览器不会在 URL 栏中显示“安全”,如果连接不是 HTTPS,浏览器中运行的 Javascript 代码可能会拒绝执行操作。
对于剩下的问题,您需要弄清楚您正在使用的“防火墙”或“代理”到底发生了什么;它可能使用许多不同的技术来处理连接,当您使用它时,这些技术将允许或阻止某些技术。
1.直接TCP连接
如果您正在建立一个终止于远程主机的 TCP 连接(上图),即使它以某种方式被修改(例如,通过 NAT 更改的地址),并且您在该 TCP 连接上设置了一个 TLS 连接,中间路由器也会无法看到超出流量、IP 地址和 TCP 端口以及它是 TLS 的事实之外的任何流量。IP 级别防火墙可能配置为禁止与 443 以外的端口的连接,或者如果发现 443 不是 TLS,则丢弃与 443 的连接。它甚至可能首先连接到端口本身,以查看服务器是否似乎在该端口上运行 HTTP/TLS。
2. HTTP 代理 CONNECT
如果您要通过使用CONNECT动词的 HTTP 代理,就像Proxytunnel一样,则涉及两个 TCP 连接,但您通过它们执行一个 TLS 连接:
client <---- TCP 1 ----> proxy <---- TCP 2 ----> server
CONNECT
<------------------ TLS ---------------->
您仍在与另一端的真实服务器协商 TLS,情况与上面的 #1 几乎相同。实际上,您不需要通过 TCP 连接执行 TLS;CONNECT server.mydom.com:22如果代理不拒绝该请求,您可以简单地开始通过该连接进行 SSH 通信。有些人正是为此目的在端口 443 上侦听 SSH 服务器。但是,如果代理足够复杂,可以检查正在使用的协议,如果它看到您没有进行标准 TLS 设置,它可能会断开您的连接,即使一旦 TLS 启动,它也无法准确看到该连接中发生了什么.
3. 中间人
一些组织对 HTTPS 连接进行中间人攻击(有时更客气地称为“SSL 拦截”)。当您尝试通过直接 TCP 连接或代理(如上述任何一种情况)连接到远程服务器时,网络设备会假装它是远程服务器。
client <---- TCP 1 ----> MITM <---- TCP 2 ----> server
<---- TLS 1 ----> <---- TLS 2 ---->
<---------------- HTTP ---------------->
您的网络浏览器会尝试 TLS 设置,检查证书,并验证它不是因为它是真正的证书,而是因为设备生成了一个由私有 CA(证书颁发机构)签名的证书,并且 IT 部门还修改了证书列表信任该 CA 的浏览器或操作系统。(您通常可以通过尝试与另一个使用不同证书列表但没有该证书的程序进行相同的连接来判断这种情况正在发生,例如 Firefox,如果您独立下载它。)您与 MITM 设备建立了安全连接,但它正在解密所有内容并在转发数据时对其进行重新加密,以便与服务器建立另一个单独的安全连接。
在这种情况下,尽管您认为您正在与远程服务器通信,但实际上您只是在安全地与代理通信,该代理可以完全访问连接上的所有数据,并且可以根据需要查看和修改它。