双向SSL澄清说明

85

我有些困惑双向SSL是如何工作的。客户端如何创建其证书以发送到服务器?它是由服务器生成并分发给客户端吗?

此外,双向SSL相比单向SSL有什么优势?

3个回答

116

在连接建立之前,两个证书都应该已经存在。它们通常由证书颁发机构(不一定是相同的)创建。(虽然有替代方案可以使用其他验证方式,但一些验证仍然需要进行。)

服务器证书应该由客户端信任的CA创建(并遵循RFC 6125定义的命名约定)。

客户端证书应该由服务器信任的CA创建。

每个参与方可以选择自己信任的内容。

有在线CA工具可让您在浏览器中申请证书,并在CA签发后将其安装在浏览器中。它们不需要在请求客户端证书身份验证的服务器上。

证书分发和信任管理是公钥基础设施(PKI)的职责,通过CA实现。 SSL/TLS客户端和服务器只是该PKI的用户。

当客户端连接到要求客户端证书身份验证的服务器时,该服务器会发送一个CA列表,作为客户端证书请求的一部分。然后,如果客户端希望并且合适的证书可用,则可以发送其客户端证书。

客户端证书身份验证的主要优点是:

  • 私人信息(私钥)永远不会发送到服务器。客户端在身份验证过程中根本不泄露它的秘密。
  • 即使服务器不知道使用该证书的用户,只要它信任颁发证书的CA(并且证书是有效的),仍然可以对该用户进行身份验证。这非常类似于护照的使用方式:您可能从未见过向您展示护照的人,但因为您信任签发机构,所以您能够将身份链接到该人。

您可能会对 Advantages of client certificates for client authentication? (on Security.SE)感兴趣。


你应该将“created”替换为“signed by”,以保持其相关性。 - CharlieS
1
@CharlieS “保持相关性”...你的意思是使用“created”(与问题中的措辞相符)不相关吗?“Issued”可能是更好的词。 - Bruno
CA是证书签名机构。证书的发行或创建方式并不重要,重要的是它是否由认证机构签名。我了解大多数CA会创建/发行由自己签名的公钥证书,并且可以使用,但如果需要已存在的公钥,则只需由CA签名即可。 - CharlieS
@CharlieS,实际上,签名只是认证过程中的最后一个技术步骤(包括颁发证书)。如果CA签署另一个CA颁发的证书,就没有意义,因为在验证时必须匹配Issuer DN和Subject DN以构建链。证书只有在签名后才会“创建”,因为在此之前它是CSR或稍后的TBSCertificate结构(但仍不是证书)。您在“创建”方面挑剔,但X.509证书必须签名才能存在,并且签名正是将该数据结构转换为证书的过程。 - Bruno
您没有允许签署由其他机构颁发的证书。x509已签名,但不一定是由受信任的机构签署的。 - CharlieS
显示剩余4条评论

50
你所说的“双向SSL”通常被称为带客户端证书认证的TLS / SSL。
在与example.com的“正常”TLS连接中,只有客户端验证它确实正在与example.com通信。服务器不知道客户端是谁。如果服务器想要验证客户端,通常使用密码,因此客户端需要向服务器发送用户名和密码,但这发生在TLS连接内部作为内部协议(例如HTTP)的一部分,而不是TLS协议本身的一部分。缺点是您需要为每个站点单独设置密码,因为您将密码发送到服务器。因此,如果您在PayPal和MyPonyForum上使用相同的密码,则每次登录MyPonyForum时,您都会将此密码发送到MyPonyForum服务器,因此该服务器的操作员可以拦截它并尝试在PayPal上进行付款,并以您的名义发出付款。
客户端证书认证提供了另一种在TLS连接中验证客户端的方式。与密码登录相比,客户端证书认证是作为TLS协议的一部分来指定的。它的工作方式类似于客户端验证服务器的方式:客户端生成一个公私钥对并将公钥提交给受信任的CA进行签名。CA返回一个客户端证书,可用于验证客户端。客户端现在可以使用同一证书来对不同的服务器进行身份验证(即您可以在PayPal和MyPonyForum上使用同一证书,而不必担心它会被滥用)。它的工作方式是,在服务器发送其证书后,要求客户端也提供一个证书。然后发生一些公钥魔术(如果您想了解详细信息,请阅读RFC 5246),现在客户端知道它正在与正确的服务器通信,服务器知道它正在与正确的客户端通信,并且两者都有一些公共密钥材料以加密和验证连接。

我创建了一个客户端 REST API,调用一个服务器端 REST API(单向 POST 调用)。我的客户端 REST API 使用由服务器端 REST API 发行的证书。但是,我的客户端 REST API 从未向服务器端 REST API 发行任何证书。它属于单向 SSL 还是双向 SSL?即使只是从客户端到服务器端的单向调用,我认为它是双向 SSL,因为服务器端 REST API 验证客户端是否具有服务器发行的正确证书。 - Himalay Majumdar
1
如果您的服务器拥有由CA签名的证书,或者您已经将该证书硬编码到客户端(固定),那么是的,这仍然是正确的TLS客户端证书认证(您称之为双向SSL)。耶 :-)。但是,如果您的客户端盲目信任您的服务器证书,则从技术上讲,它仍然是TLS客户端证书认证,但由于客户端无法检查服务器证书,因此它不是双向的,在大多数情况下都是一个非常糟糕的想法。不要这样做 :-(。 - NEOatNHNG
通常情况下,当我编写Java客户端调用启用了https的服务(自签名https)时,客户端通常会失败,因为默认情况下它不信任证书。对于我的当前Java客户端,我只是将服务器发行的证书导入到我的类路径中,以便服务器信任我的客户端,我想通过导入证书,即使我的客户端也会自动信任服务器。感谢您的回复。 - Himalay Majumdar

5
在双向SSL中,客户端要求服务器的数字证书,而服务器也要求客户端提供相同的证书。这种方式更加安全,因为是双向的,但速度比较慢。通常我们不会使用它,因为服务器不关心客户端的身份,但客户端需要确保连接到的服务器的完整性。

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