与客户端证书的SSL连接

时间:2012-08-30 10:42:36

标签: python encryption twisted ssl

客户端是否可以使用已通过其他方式交换的服务器证书与服务器建立SSL连接?

重点是使用已经与客户端的证书加密连接,而不必依赖服务器来提供它。服务器仍然拥有客户端使用的证书的私钥。

这个问题不是特定于语言的,但是特别感谢python和twisted的答案。

2 个答案:

答案 0 :(得分:4)

SSL / TLS中的证书仅用于身份验证,加密本身由握手期间协商的共享密钥完成。

如果您想使用证书,您至少需要SSL / TLS服务器才能拥有证书(可能是TCP客户端)。在建立连接时,您确实可以交换客户端和服务器的角色。也就是说,SSL / TLS服务器不必是TCP服务器,但可以是TCP客户端。请参阅specification glossary中的定义:

  client
      The application entity that initiates a TLS connection to a
      server.  This may or may not imply that the client initiated the
      underlying transport connection.  The primary operational
      difference between the server and client is that the server is
      generally authenticated, while the client is only optionally
      authenticated.

然而,这样做会导致困难。就像传统SSL / TLS连接中的服务器无法检测请求是否已通过MITM(客户端负责检查服务器证书,没有客户端证书身份验证),使TCP客户端成为SSL / TLS服务器使TCP客户端很难知道它正在与它预期的TCP服务器通信:服务器实际上可能是MITM。您需要考虑这是否符合您的需求。

在Python中,您应该能够使用ssl.wrap_socketserver_side参数选择SSL / TLS套接字的方向。

  

服务器仍然拥有证书的私钥   客户使用。

这根本没有意义。私钥应由颁发证书的一方保密。

也许您正在使用预共享密钥机制。

答案 1 :(得分:0)

在TLS中,服务器(listen用于连接的一方)始终需要证书。客户端证书只能用于对等身份验证,但不能用于通道加密。

请记住,您不能简单地“加密”没有某些基础设施的连接,以某种方式验证证书(例如,使用证书颁发机构或信任数据库)。没有证书有效性验证的加密不能阻止活动对手(google为'中间人攻击'了解更多详情)。