公钥密码术指定包括非对称加密(及其表亲密钥交换)和数字签名的密码算法类别。在这些算法中,有两个相互对应的操作(加密 -> 解密,或签名 -> 验证),其特点是每个人都可以完成其中一个操作,而另一个在数学上仅限于特定的所有者秘密。公共操作(加密消息、验证签名)使用称为公钥的公共参数;相应的私有操作(解密已加密的内容,签署可验证的内容)使用称为私有密钥的相应私有参数. 公钥和私钥来自一个共同的底层数学对象,并被称为公钥/私钥对。非对称密码学的神奇之处在于,虽然密钥对的公共部分和私人部分相互对应,但公共部分确实可以公开,而这并不会泄露私人部分。只能通过现有技术无法想象的成本太高的计算,才能从公钥计算出私钥。
简而言之,如果您知道某个实体(服务器、人类用户......)的公钥,那么您可以与该实体建立一个安全的数据隧道(例如,在连接的上下文中使用 SSL/TLS,或加密带有 S/MIME 的电子邮件)。
现在的问题是密钥分配之一。当您要连接到一个名为的服务器www.example.com
时,如何确保您将要使用的公钥确实属于该服务器?通过“属于”,我们的意思是相应的私钥在该服务器(而不是其他人)的控制之下。
公钥基础设施是该问题的解决方案。基本上:
- PKI的目标是为用户提供一些关于公钥所有权的可验证保证。
- PKI的手段是数字签名。
从这个意义上说,PKI 是使用公钥密码的支持系统,它本身使用公钥密码。
PKI 的核心概念是证书。证书包含身份(例如,服务器名称)和公钥,据称属于指定实体(即命名服务器)。整个由认证机构签署. CA 应该以某种方式“确保”公钥确实由命名实体拥有,然后颁发(即签署)证书;CA 也有自己的公钥/私钥对。这样,看到证书并知道 CA 公钥的用户(例如,Web 浏览器)可以验证证书上的签名,从而获得证书内容的信心,从而了解指定实体(其服务器)之间的映射关系。名称在证书中)及其公钥。
花五分钟时间掌握该机制的细节。签名本身并不能使某些东西值得信赖。当消息M被签名并且签名被公钥K p成功验证时,密码学会告诉你消息M与它完全一样,直到最后一位,当相应的私钥K s的所有者计算出签名。这不会自动告诉您M的内容是正确的。证书的作用是解决密钥分配问题:最初你的问题是知道服务器的公钥;现在它是知道 CA 的公钥之一,另外一个问题是您还必须信任该 CA。
那么 PKI 如何提供帮助呢?重要的一点是关于数字。给定的 CA 可以为数百万台服务器颁发证书。因此,通过 CA 的行动,密钥分配问题已通过两种方式修改:
当应用递归时,PKI 成为真正的基础设施:CA 的公钥本身存储在由某些 über-CA 签名的证书中。这进一步减少了用户需要先验知道的密钥数量;这也增加了信任问题。事实上,如果 CA2 为 CA1 签署了证书,而 CA1 为服务器 S 签署了证书,那么想要验证服务器 S 的最终用户必须相信 CA2 是诚实的、有能力的,并且还要以某种方式注意不签发向不称职或不诚实的 CA 颁发证书。这里:
- CA1 说:“服务器S的公钥是xxx ”。CA1没有说“服务器S诚实守信”。
- CA2 说:“CA1 的公钥是yyy并且 CA 是值得信赖的”。
如果你迭代这个过程,你最终会得到一些最终用户事先知道的根 CA (在X.509术语中称为“信任锚” ) (它们包含在您的操作系统/浏览器中),并且被认为是值得信赖的在所有元级别。即我们信任根 CA 以正确识别中间 CA并能够验证它们的可信度,包括它们自己委托这种可信度的能力。
微软认为默认包含在 Windows 中的数百个根 CA 是否值得信赖是一个悬而未决的问题。整个 PKI 结构具有以下特点:
请注意,在整个链条中,服务器S被验证为确实拥有特定的公钥,但没有人说服务器是诚实的。当您连接https://www.wewillgraballyourmoney.com/
并看到标志性的绿色挂锁时,整个 PKI 保证您确实在与该特定服务器通话;它并没有告诉您将您的信用卡号码发送给他们是个好主意。
此外,所有这些都是出现在目标 URL 中的服务器名称与公钥之间的关联。这不会扩展到用户想要的名称,因为该名称仅存在于用户的大脑中。如果用户想连接到www.paypal.com
但真的遵循一个 URL 到www.paaypaal.com
,那么 PKI 和浏览器将无法注意到用户真的想与 PayPal 对话,而不是另一个具有大致相似(但不相同)的服务器) 名称。
PKI的主要用例是为许多实体分发公钥。对于 Web 浏览器和 SSL,浏览器用户必须能够检查他尝试与之通信的服务器是否确实是他认为的服务器;这必须适用于数以亿计的服务器,其中一些是在编写和部署浏览器之后才存在的。减少了问题知道了一百根CA密钥使得它易于管理,因为一个能确实包括在Web浏览器百个公共密钥(这是不是包括在Web浏览器亿元公共密钥更容易万次)。
客户端证书是 SSL 特定的功能。在上述所有内容中,我们都谈到了SSL 客户端(Web 浏览器)尝试验证SSL 服务器(使用 HTTPS 的 Web 服务器)。SSL 还支持另一个方向:想要确保与特定的命名客户端对话的 SSL 服务器。可以使用与证书相同的机制。
需要注意的重要一点是服务器证书和客户端证书存在于不同的世界中。服务器证书由客户端验证。客户端证书由服务器验证。两种验证相互独立;它们由不同的实体执行,并且可能使用不同的根 CA。
SSL 服务器拥有证书的主要原因是因为客户端不可能事先知道所有服务器的公钥:它们太多了,并且每隔一分钟就会创建新的公钥。另一方面,当服务器想要对客户端进行身份验证时,这是因为该客户端是注册用户。通常,服务器知道他们所有的用户,这就是为什么大多数人可以使用更简单的基于密码的身份验证机制。因此,SSL 客户端证书在实践中相当少见,因为证书的主要优势(在没有先验知识的情况下验证实体)并不是大多数服务器想要的功能。