3

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

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

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

4

2 回答 2

4

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

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

  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 中,您应该能够server_side使用ssl.wrap_socket.

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

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

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

于 2012-08-30T11:01:09.150 回答
0

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

还要记住,如果没有一些基础设施以某种方式验证证书(例如使用证书颁发机构或信任数据库),您不能简单地“加密”连接。没有证书有效性验证的加密不适用于活跃的对手(谷歌搜索“中间人攻击”以获得更多详细信息)。

于 2012-08-30T10:49:10.713 回答