我正在使用Python的Twisted实现客户端,连接时会检查服务器的SSL证书,基本上遵循 这份 配方。在许多HOWTO中,例如此处,我已经看到服务器通过SSL证书检查客户端的真实性。目前,我使用唯一的ID和1024个字符字符串来验证我的客户端(它们是没有人类交互的自动化客户端)。我不明白的是,为什么我要为此使用整个SSL而不是只将"密码"发送到服务器。毕竟,连接已经是SSL加密的,检查了服务器证书和其他内容。这里 是一个相似的问题,但我想知道人们为什么使用SSL客户端证书,而不仅仅是最好的替代方法。
客户端证书限制只有经过授权的人才能访问。假设您的证书已正确分发和管理,这使得从未经授权的位置连接(或者说从机器人网络连接)更加困难,因为您需要的不仅仅是用户名和密码。 如果您在一个可以管理客户端证书的环境中,客户端证书是防御性深度策略的一个潜在组成部分。
使用基于客户端证书的双向认证可以防止以下攻击/问题: 仿冒密码 键盘记录密码 窥视屏幕记录密码 猜测密码 在多个服务中重复使用密码 此外,使用客户端证书还可以将客户端证书(及其匹配的私钥)存储在智能卡、USB令牌或其他硬件安全模块(HSM)上,从而从“something you know”(密码)转变为“something you possess physically”(令牌、卡)加上“something you know”(PIN)。这也被称为双因素身份验证。在您使用密码作为技术性系统到系统通信链中的共享密钥的特定情况下,使用证书有两个优点: 可扩展性更好:使用共享密钥,每个节点都必须与每个其他节点共享不同的密钥/密码,导致(n-1)!个密码,而使用证书,每个节点只需要一个证书和私钥(n个证书加上一个CA)。 可以将密钥存储在HSM上,从而防止数字副本/窃取。
拥有由证书颁发机构签名的SSL证书意味着SSL证书所有者已经通过CA的验证,以证明所有者是他们所说的人。例如,如果您拥有一个名为widgetsdeluxe.com的电子商务店,并且您拥有一个由Verisign等签名的widgetsdeluxe.com域的证书,购物者将知道当他们访问该站点并且证书上的名称与他们访问的实际域名匹配时,他们可以信任该信息是安全的,并来自widgetsdeluxe.com域(这是为了防止欺骗和中间人攻击)。