为什么应该使用证书对客户进行身份验证?

17
我正在使用Python的Twisted实现客户端,连接时会检查服务器的SSL证书,基本上遵循 这份 配方。在许多HOWTO中,例如此处,我已经看到服务器通过SSL证书检查客户端的真实性。目前,我使用唯一的ID和1024个字符字符串来验证我的客户端(它们是没有人类交互的自动化客户端)。
我不明白的是,为什么我要为此使用整个SSL而不是只将"密码"发送到服务器。毕竟,连接已经是SSL加密的,检查了服务器证书和其他内容。这里 是一个相似的问题,但我想知道人们为什么使用SSL客户端证书,而不仅仅是最好的替代方法。
5个回答

4

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

如果您在一个可以管理客户端证书的环境中,客户端证书是防御性深度策略的一个潜在组成部分。


客户端正在检查服务器证书,因此只能使用真实服务器进行连接。如果使用服务器SSL设置加密连接,是否仍然可以进行中间人攻击?我想客户端证书可能会使使用无效身份验证请求的DDoS攻击更加困难,但我不确定。我的意思是,对我来说,客户端证书基本上就是一个花哨的密码,我看不出有什么区别。感谢您的回答。 - Luiz Geron
1
MITM攻击不应该在SSL中存在(显然要检查服务器证书)。 然而,用户名和密码很容易被泄露。 因此,为了另一层安全保障,客户端证书不仅仅是一个花哨的用户名/密码 - 它是一个带有分发管理系统和吊销等级别的签名工件。使用普通的用户名和密码,您可以从多台计算机尝试不同的密码攻击,而无需证书。 客户端证书是另一种安全级别 - 通常只能在受控环境中实现。 - Cade Roux
是的,证书的管理和分发是棘手的部分。 - Marc Novakowski

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

2
我编写的客户端不需要任何人工输入,因此密码已经在客户端读取并发送到服务器的文本文件中。如果有人能够窃取密码文件,则也可以窃取客户端证书文件。如果我需要“撤销”客户端密码,我只需在数据库/其他地方更改即可。那么,在这种情况下,使用证书而不是文件上的pwd字符串有什么优点呢? - Luiz Geron
1
密码是否以明文形式通过网络发送?如果是,那么它可能会被窃取。大多数操作系统将客户端证书存储在特定于登录的加密存储中。 - Greg

2
使用基于客户端证书的双向认证可以防止以下攻击/问题:
  • 仿冒密码
  • 键盘记录密码
  • 窥视屏幕记录密码
  • 猜测密码
  • 在多个服务中重复使用密码
此外,使用客户端证书还可以将客户端证书(及其匹配的私钥)存储在智能卡、USB令牌或其他硬件安全模块(HSM)上,从而从“something you know”(密码)转变为“something you possess physically”(令牌、卡)加上“something you know”(PIN)。这也被称为双因素身份验证
在您使用密码作为技术性系统到系统通信链中的共享密钥的特定情况下,使用证书有两个优点:
  • 可扩展性更好:使用共享密钥,每个节点都必须与每个其他节点共享不同的密钥/密码,导致(n-1)!个密码,而使用证书,每个节点只需要一个证书和私钥(n个证书加上一个CA)。
  • 可以将密钥存储在HSM上,从而防止数字副本/窃取。

1
客户端认证的主要优点(即服务器检查客户端证书时)是,如果服务器被攻击,客户端的私钥证书不会被泄露。而如果客户端使用凭据,则凭据可能随着服务器一起被泄露。

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

这个回答仅涉及服务器证书,而问题是关于客户端证书的实用性。 - Cade Roux

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接