没有 SNI 时无法验证证书主机名

没有 SNI 时无法验证证书主机名

我使用 2 个代理来拦截我的手机和服务器之间的通信。这是我的拓扑:

phone --> proxy 1 --> proxy 2 --> server

proxy1 正在监听端口 8080,proxy 2 正在监听端口 8080,但我将其收到的所有内容重定向到端口 80 和 443,最后我的服务器正在监听端口 443。

手机的 IP 地址:192.168.10.199

proxy2 的 IP 地址:192.168.10.246

服务器的 IP 地址:192.168.10.211

我使用的所有设备都在我的局域网中。

我的手机上安装了第一个代理(Android)它使我能够将来自我手机的所有流量路由到第二个代理(当我单独使用第二个代理时,它不会拦截所有流量,这是因为有些应用程序选择直接与服务器通信而不通过代理,即使我的手机已经 root 了)。

我使用 Wireshark 来可视化我的手机和服务器之间的通信第二个代理是 mitmproxy,我已经在手机上安装了证书,下面是我得到的结果:

192.168.10.199 192.168.10.246 POST /message HTTP/1.1

192.168.10.199 是我手机的 IP 地址,192.168.10.246 是代理 2 的 IP 地址,因此代理 2 正在接收来自我手机的信息,但是当它尝试传输到服务器时,我得到的信息如下:

192.168.10.246 192.168.10.199 HTTP/1.1 502 Bad Gateway (text/html), Alert (Level: Warning, Description: Close Notify)

这正是我在 Wireshark 上收到的消息:

<html>
        <head>
            <title>502 Bad Gateway</title>
        </head>
        <body>
        <h1>502 Bad Gateway</h1>
        <p>TlsProtocolException(&quot;Cannot establish TLS with 192.168.10.211:443 (sni: None): TlsException(&#x27;Cannot validate certificate hostname without SNI&#x27;,)&quot;,)</p>
        </body>
</html>

我尝试在 Postman 上运行相同的请求POST https://192.168.10.211:443/message,但收到的消息不一样:

无法获得任何响应 连接到https://192.168.10.211:443/消息

发生这种情况的原因:

服务器无法发送响应:

确保后端正常工作自签名 SSL 证书被阻止:

通过在“设置”>“常规”中关闭“SSL 证书验证”来解决此问题

代理配置不正确

确保在“设置”>“代理”中正确配置了代理

请求超时:

在“设置”>“常规”中更改请求超时

我想了解到底发生了什么?我猜证书必须安装在第一个代理上(安装在我的手机上),而不是手机本身上,这就是为什么我得到上述异常的原因。我说得对吗?

答案1

这似乎是服务器端错误,而不是设备特定的错误。

您是否已确认 Web 服务器正在端口 443 上运行并且无需代理即可访问?

以下是有关实际 502 错误代码的更多信息。https://www.lifewire.com/502-bad-gateway-error-explained-2622939

答案2

更新

最初我以为问题出在代理 2 上......

肯定是你的Proxy1转发请求的时候没有维护host headers,配置它维护host headers。

如果您能提供那是什么类型的代理,我可以用适当的配置更新我的答案。

例如,对于 Apache,您可以使用ProxyPreserveHost指令。请参阅文档

对于 mitmproxy 来说keep_host_header,描述如下那里

相关内容