我假设威胁模型是 Alice 和 Bob 之间可能存在中间人攻击者,并且 Alice 和 Bob 不在同一个受信任的子网上。这就是 SSL/TLS 旨在防止的内容,这就是为什么 Alice 应该在您的示例中检查 Bob 的证书(至少)。
从 Bob 的角度来看,检查 Alice 的请求是否来自已知的 IP 地址并没有多大用处。攻击者可以伪造和更改数据包,使它们看起来像是来自他们想要的 IP 地址。随后,DNS 查找也毫无用处:您所需要的只是确保您伪造数据包以使用具有正确 DNS 条目的 IP 地址。
当 Bob 在 SSL/TLS 握手期间向 Alice 请求客户端证书时,这也会让 Alice 在 SSL/TLS 握手期间发送她的证书并使用她的私钥来确认她的身份。握手成功完成后,Bob 将知道 Alice 拥有该证书的私钥,并且必须验证它是否信任该证书。
当您使用 SSL/TLS 时,请求是否来自代理后面并不重要。HTTP 代理只是将 SSL/TLS 连接从原始客户端传输到目标服务器。
对 Bob 来说重要的是他将如何验证 Alice 的证书。通常,这将使用 PKI 以与 Alice 验证 Bob 的证书相同的方式完成,尽管这不需要与 Bob 的 CA 相同(它需要是 Bob 信任的东西)。请注意,这也不需要使用 PKI。可以根据给定列表验证证书(例如,如果 Alice 和 Bob 以前见过面),但这可能会有点复杂,因为 Bob 可能必须调整它发送的接受的颁发者列表(例如,发送一个空的,这是 TLS 1.1 明确允许的,但在以前的版本中没有指定任何一种方式,请参阅证书请求消息)并使用自定义代码来验证该证书。(我过去曾实施过这种方案,效果很好。)
使用我称之为“MITM 代理服务器”的东西时有一个例外,即代理服务器被配置为通过插入自己的证书来欺骗实际的 SSL/TLS 服务器(请参阅Squid 的 SSL Bump)。在这种情况下,Alice 看到的证书不会来自 Diginotar,而是来自另一个 CA(通常是在公司 LAN 上完成的公司 CA)。
尽管 Alice 可能允许自己信任这样的 MITM 代理,但使用 SSL/TLS 客户端证书身份验证将使 Bob 意识到存在 MITM 并且连接将失败。CertificateVerify
这是因为 Alice 应该在她的消息中签署整个 SSL/TLS 握手(如 Alice 和 Bob 所见)以使用客户端证书进行身份验证。由于 MITM 代理将替换 Bob 的证书,Alice 和 Bob 发送的签名将不匹配。