为啥要使用证书对客户端进行身份验证?

Posted

技术标签:

【中文标题】为啥要使用证书对客户端进行身份验证?【英文标题】:Why should I authenticate a client using a certificate?为什么要使用证书对客户端进行身份验证? 【发布时间】:2011-01-10 23:40:33 【问题描述】:

我正在使用 python 的 twisted 实现一个客户端,它在连接时检查服务器 ssl 证书,基本上遵循 this 配方。我在许多 HOWTO 中看到过,例如服务器也通过 ssl 证书检查客户端的真实性。目前我使用唯一的 id 和 1024 字符字符串对我的客户进行身份验证(它们是没有人工交互的自动化客户端)。

我不明白为什么我必须为此使用整个 ssl 而不是仅仅将“密码”发送到服务器。在所有连接都已经 ssl 加密之后,检查服务器证书和所有内容。 This 是一个类似的问题,但我想知道为什么人们使用 ssl 客户端证书,而不仅仅是最好的方法。

【问题讨论】:

【参考方案1】:

客户端身份验证(即服务器检查客户端证书时)的主要优点是,如果服务器被泄露,客户端的密钥(证书的私钥)不会被泄露。而如果客户端使用凭据,它们可能会与服务器一起受到攻击。

【讨论】:

【参考方案2】:

使用基于客户端证书的相互身份验证至少可以防止以下攻击/问题:

钓鱼密码 密钥记录密码 肩膀上网密码 猜密码 在多个服务上重复使用密码

此外,使用客户端证书使您可以将客户端证书(和匹配的私钥)存储在智能卡、USB 令牌或其他硬件安全模块 (HSM) 上,从而从“您知道的东西”(密码)变为“你物理上拥有的东西”(令牌,卡)加上“你知道的东西”(PIN)。这也称为two-factor authentication。

在您在技术、系统到系统通信链接中使用密码作为共享密钥的特定情况下,使用证书有两个优点:

扩展性更好:使用共享密钥,每个节点都必须与其他节点共享不同的密钥/密码,结果为 (n-1)!密码,而使用证书时,每个节点只需要一个证书和私钥(n 个证书加上一个 CA) 可以将密钥存储在 HSM 上,从而防止其以数字方式被复制/窃取。

【讨论】:

【参考方案3】:

证书很容易被撤销。密码可以被窃取,但窃取客户端证书会更难。

【讨论】:

我写的客户端不需要任何人工输入,所以密码已经在客户端读取并发送到服务器的文本文件中。如果有人可以窃取密码文件,他们也可以窃取客户端证书文件。如果我需要“撤销”客户端密码,我可以在数据库/其他任何地方更改它。那么在这种情况下,在文件上使用证书而不是 pwd 字符串有什么优势? 密码是否以明文形式通过网络发送?如果是,它可能会被盗。大多数操作系统将客户端证书存储在特定于所用登录名的加密存储中。【参考方案4】:

客户端证书将访问权限限制为获得证书授权的人员。假设您的证书被正确分发和管理,这使得从未经授权的位置(或者说,机器人网络)进行连接变得更加困难,因为您需要的不仅仅是用户名和密码。

客户端证书是纵深防御策略的潜在部分如果您处于可以管理客户端证书的环境中。

【讨论】:

客户端正在检查服务器证书,因此只能与真实服务器建立连接。如果使用服务器 ssl 设置对连接进行加密,有人还能进行中间人攻击吗?我想客户端证书可能会使我的服务器更难使用无效的身份验证请求,但我不确定。我的意思是在我看来客户端证书基本上是一个花哨的密码,我看不出有什么区别。谢谢你的回答。 不应该使用 SSL 进行 MITM 攻击(显然,请检查服务器证书)。但是,用户名/密码很容易泄露。所以对于另一层来说,客户端证书不仅仅是一个花哨的用户/密码——它是一个带有分发管理系统和撤销等的签名工件。使用普通的用户名/密码,您可以尝试来自多台机器的不同密码攻击,而无需证书。客户端证书用于另一种安全级别 - 通常只能在受控环境中使用。 是的,证书的管理和分发是棘手的部分。【参考方案5】:

拥有由证书颁发机构签署的 SSL 证书意味着 SSL 证书所有者已经经历了由 CA 验证所有者就是他们所说的身份的麻烦。例如,如果您有一个名为 widgetsdeluxe.com 的电子商务商店,并且您有一个由 Verisign 等签署的域 widgetsdeluxe.com 的证书。另外,购物者会知道,当他们访问该站点并且证书上的名称与他们访问的实际域名匹配时,他们可以相信信息是安全的并且来自 widgetsdeluxe.com 域(这是为了防止欺骗和中间人攻击)。

【讨论】:

此答案仅针对服务器证书,OP 询问为什么客户端证书会有用。

以上是关于为啥要使用证书对客户端进行身份验证?的主要内容,如果未能解决你的问题,请参考以下文章

通过 HTTPS 上的客户端证书对 WCF 请求进行身份验证

智能卡如何用于客户端证书身份验证?

SAVON 是不是支持客户端证书身份验证

Azure 中的客户端证书身份验证和 CA 证书

如何使用 Apache 进行客户端证书身份验证

通过证书进行客户端身份验证的 Swift 3 UrlSession