2012-05-23 79 views
46

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

此外,双向SSL优于单向SSL的优势是什么?

回答

71

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

服务器证书应该由客户端信任(及以下的命名约定在RFC 6125定义的CA创建)。

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

这取决于每一方选择信任。

有一些在线CA工具可以让您在浏览器中申请证书,并在CA发布证书后将其安装到证书中。它们不需要位于请求客户端证书认证的服务器上。

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

当客户端连接到请求客户端证书认证的服务器时,服务器会发送它愿意接受的CA列表作为客户端证书请求的一部分。客户随后可以发送其客户证书,如果它希望并且合适的证书可用。

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

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

您可能也有兴趣Advantages of client certificates for client authentication? (on Security.SE)

+2

+1对于一个很好的解释,而不是给予请求谷歌答案;) – Dexters

+0

你应该用'signed by'替换'created'以保持这个相关性 – CharlieS

+1

@CharlieS“*保持这种相关性*”...你的意思是它是在使用“创建”(与问题相符的措辞)时不相关;-)? “发布”确实可能是一个更好的词。 – Bruno

23

您称之为“双向SSL”通常称为带客户端证书认证的TLS/SSL。

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

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

+0

我创建了一个client-rest-api,它调用了一个server-rest-api(单向通话)。我的client-rest-api使用由server-rest-api发布的证书。但是我的客户端rest-api从来没有向server-rest-api发出任何证书。它是根据单向SSL还是双向SSL? 事件,虽然它只是从客户端到服务器的单向调用,但我认为它的双向ssl,因为在这里server-rest-api验证客户端是否具有服务器发出的正确证书? –

+1

@HimalayMajumdar:如果你的服务器有一个由CA签名的证书,或者你已经将该证书硬编码到你的客户端(固定),那么是的,它仍然是适当的TLS和客户端证书验证(你称之为two-way-ssl)。好极了 :-)。但是,如果您的客户盲目地信任您的服务器证书,它在技术上仍然是带有客户端证书身份验证的TLS,但是由于服务器证书无法由客户端进行检查,所以不是双向的,而且在大多数情况下这是一个非常糟糕的主意。不要这么做:-(。 – NEOatNHNG

+0

通常当我编写Java客户端调用支持https的服务(自签名https)时,客户端通常会因为默认情况下不信任证书而失败。只是将服务器发布的证书导入到我的类路径中,以便服务器信任我的客户端,我猜想通过导入证书甚至我的客户端自动信任服务器。感谢您的回复。 –

4

在双向ssl客户端请求服务器数字证书和服务器从客户端请求相同。虽然它有点慢,但它更安全,因为它是两种方式。通常我们不会关注它,因为服务器不关心客户端的身份,但客户端需要确定它所连接的服务器的完整性。