与客户端证书的SSL连接

3

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

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

这个问题不特定于语言,但是希望得到关于Python和Twisted的具体答案。

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中,您应该能够使用ssl.wrap_socketserver_side参数选择SSL/TLS套接字的方向。

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

这根本没有意义。私钥应由发出证书的一方保密。
也许你想要一个预共享密钥机制。

“Key”指的是CSR,其中包括公钥。例如,我希望客户端在获取应用程序时获得该公钥,然后使用它从服务器获取对称密钥,该密钥将用于加密进一步的通信。假设安全交换该公钥不成问题,那么为了论证而做出这种假设,服务器不需要进一步的证书。 - xor
啊...好吧,你确实说了“私钥”(如果你的意思是公钥,请随意编辑你的问题)。如果你想让客户端使用服务器的公钥对服务器进行身份验证,那么就按照正常的方式操作:在服务器上设置证书和私钥,并将其证书导入客户端作为受信任的证书(如果它是自签名证书或你自己的 CA 证书,你可以将其与应用程序捆绑在一起)。 - Bruno
我想你是对的,这确实是一种预共享密钥机制,但我希望密钥是非对称的。 - xor
1
不,这与PSK无关。你似乎想要将自己的服务器证书分发给客户端应用程序,以便客户端应用程序在连接时可以识别服务器,而不依赖于已建立的CA。 - Bruno
1
在您的编辑之后,这比您最初想象的要简单得多:您应该能够将该证书明确地传递给客户端上的 ca_certs= - Bruno

0
在TLS中,服务器(即侦听连接的一方)始终需要证书。客户端证书仅用于对等身份验证,而不用于通道加密。
还要记住,您不能简单地“加密”连接而没有某种基础设施以某种方式验证证书(例如使用认证机构或信任数据库)。没有证书有效性验证的加密无法抵御主动攻击者(有关此更多详细信息,请搜索“中间人攻击”)。

我并不打算就CA的有效性展开讨论,但我仍然想绕过它们,即使只是为了测试一下。 - xor

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