双向SSL澄清


76

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

此外,与单向SSL相比,双向SSL有何优势?

Answers:


104

这两个证书应在连接之前存在。它们通常是由证书颁发机构创建的(不一定相同)。(有替代情况下,验证可以做不同的,但一些验证需要进行。)

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

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

由各方选择自己信任的内容。

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

证书分发和信任管理是通过CA实现的公钥基础结构(PKI)的角色。SSL / TLS客户端和服务器,然后仅是该PKI的用户。

当客户端连接到请求客户端证书身份验证的服务器时,服务器将发送一个其愿意接受的CA列表,作为客户端证书请求的一部分。然后,如果愿意,客户端便可以发送其客户端证书,并且可以使用合适的证书。

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

  • 私有信息(私有密钥)永远不会发送到服务器。客户端在身份验证期间根本不会泄漏其秘密。
  • 不知道拥有该证书的用户的服务器仍可以对该用户进行身份验证,前提是它信任颁发该证书的CA(并且该证书有效)。这与使用护照的方式非常相似:您可能从未见过向您展示护照的人,但是由于您信任签发机构,因此可以将身份链接到该人。

您可能对客户端身份验证的客户端证书的优势感兴趣(在Security.SE上)


您应将“ created”替换为“ signed by”以保持相关性
CharlieS 2014年

1
@CharlieS“保持相关性” ...您是否表示使用“ created”(与问题一致的措辞);-)时不相关?确实,“发行”可能是一个更好的词。
布鲁诺2014年

CA是证书签名机构。证书的发行或创建方式无关紧要,仅由证书颁发机构签署才有意义。我了解大多数CA会创建/发布由他们自己签名的公钥证书,并且可以使用它们,但是如果需要已经存在的公钥,则只需由CA对其进行签名。
CharlieS 2014年

@CharlieS不,签名真的只是认证过程中的最后一个技术步骤(包括颁发证书)。对于一个CA来说,签署另一个CA颁发的证书是没有意义的,因为在验证时,您必须将Issuer DN与Subject DN相匹配以​​构建链。仅在签名后才“创建”证书,因为在此之前它是CSR或稍后的TBSCertificate结构(但仍不是证书)。你对“创造”的挑剔,但X.509证书要签名存在,并签署它恰恰是原来的数据结构到证书。
布鲁诺2014年

您不允许签署其他机构颁发的证书。x509已签名,但不一定由受信任的机构签名。
CharlieS

44

所谓的“双向SSL”通常称为具有客户端证书身份验证的TLS / SSL。

在与example.com的“常规” TLS连接中,只有客户端才能验证它确实与example.com服务器进行通信。服务器不知道客户端是谁。如果服务器要对客户端进行身份验证,通常的事情是使用密码,因此客户端需要向服务器发送用户名和密码,但这是在TLS连接中作为内部协议(例如HTTP)的一部分发生的,不是TLS协议本身的一部分。缺点是,因为将密码发送到服务器,所以每个站点都需要一个单独的密码。因此,如果您在例如PayPal和MyPonyForum上使用相同的密码,则每次登录MyPonyForum时,都会将此密码发送到MyPonyForum的服务器,以便该服务器的操作员可以截取该密码并在PayPal上尝试,并可以以您的名义进行付款。

客户端证书身份验证提供了另一种在TLS连接中对客户端进行身份验证的方法。与密码登录相反,客户端证书身份验证被指定为TLS协议的一部分。它的工作方式类似于客户端对服务器进行身份验证的方式:客户端生成一个公钥对,并将公钥提交给受信任的CA进行签名。CA返回可用于验证客户端身份的客户端证书。客户端现在可以使用相同的证书对不同的服务器进行身份验证(即,您可以对PayPal和MyPonyForum使用相同的证书,而不必担心会被滥用)。它的工作方式是在服务器发送其证书后,它也要求客户端提供证书。然后发生一些公共密钥魔术(如果您想了解详细信息,请阅读RFC 5246),现在客户端知道它与正确的服务器进行通信,服务器知道它与正确的客户端进行通信,并且两者都具有一些用于加密和验证连接的通用密钥材料。


我创建了一个client-rest-api,它调用了server-rest-api(一种单向调用)。我的client-rest-api使用server-rest-api颁发的证书。但是,我的client-rest-api从未向server-rest-api颁发任何证书。它属于单向ssl还是双向ssl?事件虽然只是从客户端到服务器的一种单向调用,但我在想它的双向SSL,因为这里的server-rest-api可以验证客户端是否具有服务器颁发的正确证书?
喜马拉雅Majumdar

1
@HimalayMajumdar:如果您的服务器具有由CA签名的证书,或者已将该证书硬编码到客户端中(固定),那么可以,它仍然是具有客户端证书身份验证的TLS(您将其称为双向SSL)。好极了 :-)。但是,如果您的客户端盲目地信任您的服务器证书,那么从技术上讲,它仍然是具有客户端证书身份验证的TLS,但是由于客户端无法检查服务器证书,因此它不是双向的,在大多数情况下,这是一个非常糟糕的主意。不要这样做:
。– NEOatNHNG

通常,当我编写Java客户端调用启用了https的服务(自签名https)时,客户端通常会失败,因为默认情况下它不信任证书。在我当前的Java客户端的情况下,我只是将服务器发布的证书导入到我的类路径中,以使服务器信任我的客户端,我猜想通过导入证书,即使我的客户端自动信任服务器也是如此。感谢您的答复。
喜马拉雅Majumdar

5

客户端使用两种方式ssl要求服务器提供数字证书,而服务器则要求客户端提供相同的证书。尽管它有点慢,但由于双向都比较安全。通常,我们不遵循它,因为服务器不关心客户端的身份,但是客户端需要确保其连接到的服务器的完整性。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.