使用 SSL 的双向身份验证如何工作?

信息安全 验证 tls dns
2021-08-12 04:26:57

假设 Alice 想在 Bob 上使用网络服务。

鲍勃在 bob.in.wonderland.com

爱丽丝打开一个到 的连接bob.in.wonderland.com:443被 DNS 魔法兔子带走,Alice 抵达443港口69.64.156.40

Alice 要求提供证书,Bob 出示由 Diginotar 颁发给 的证书bob.in.wonderland.com由于 Alice 信任 Diginotar,因此她确信确实在与 Bob 交谈。


但 Bob 想确认 Alice 是否在他的白名单中。

目前,Bob 只知道他收到了来自 ip address 的连接66.147.244.191

他要求提供证书,并获得了由 Verisign 为alice.in.wonderland.com.

鲍勃现在做什么?

他是否进行了反向 DNS66.147.244.191以查看它是否被调用alice.in.wonderland.com

如果Alice在 Squid 代理后面怎么办?

3个回答

我假设威胁模型是 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 发送的签名将不匹配。

不完全的。SSL 握手完成后,Bob 知道他正在与 Verisign 认证为alice.in.wonderland.com. Bob 在这一点上如何处理这些信息取决于他,并且取决于特定的应用程序。一些例子:

  • Bob 可能有一个允许连接的客户端白名单。alice.in.wonderland.com然后 Bob 会在这个列表中查找。(Bob 也可以有一个公钥白名单,但客户端证书可能会让 Bob 更容易管理,因为他现在可以在他的白名单中输入人类可读的值。)

  • Bob 可能将alice.in.wonderland.com其视为 Alice 的用户名并将她登录到她的帐户。换句话说,Bob 可能有一个包含用户列表的数据库;对于每个用户,它将具有用户名(在用户的证书中找到)以及与该用户关联的所有信息。一旦 Bob 收到来自名为 N 的某人的连接,Bob 可以在表中查找 N 并自动将客户端登录为 N。当有人创建新帐户时,Bob 可以使用在其证书中找到的名称自动创建一个新帐户 (假设一个尚不存在)。结果是用户可以登录 Bob 的服务,而无需输入用户名或密码;他们的客户证书用于对他们进行身份验证。

同样,这取决于应用程序;这取决于 Bob 想知道他正在与之交谈的计算机的身份。没有单一的答案。

这将取决于具体的实现。

一般来说,Alice 会充当 Bob 的客户。如果 Bob 期望只有其他授权服务器连接,Bob 将根据颁发者 CRL 检查证书的有效性(包括过期),并针对名称执行反向查找。如果 Bob 期待用户客户端,则可能会跳过反向查找或仅用于记录。

如果 Bob 预计 Alice 是从已知的可信主机连接的,那么 Bob 会预计 Alice 的 IP 地址与 DNS 记录匹配。对 Bob 来说,Alice 在代理后面并不重要,Bob 只会看到代理的 IP 地址。所以alice.in.wonderland.com需要配置到代理的外部IP地址。

然而,关键部分是:

  1. Bob 将已经将 Alice 的公钥映射到某种 ID,该 ID 将用于授予对 Bob 资源的访问权限。
  2. Bob 和 Alice 将互相挑战,互相发送一条消息,每个人都只能用他们的私钥解密。从而证明他们拥有双方都知道和信任的证书。

另请注意:如果 Alice 在代理后面,则代理需要拥有 Alice 的私钥(以便代理可以代表 Alice 与 Bob 交谈)或者必须通过 Alice 的连接而不改变其内容。

有关特定技术细节的附加参考http://en.wikipedia.org/wiki/Transport_Layer_Securityhttps://www.rfc-editor.org/rfc/rfc5246

希望有帮助。