在Python中使用Diffie-Hellman的服务器端SSL



我正在尝试使用Diffie-Hellman SSL设置套接字,但似乎找不到有关如何执行此操作的任何文档。我注意到Python 3.3+中的SSLContext支持load_dh_params和set_ecdh_curve这表明使用DH是可能的。

我对使用 SSL 相当陌生,所以可能缺少一些明显的东西,但这是我使用的代码:

sock = socket.socket()
sock.bind((HOST, PORT))
sock.listen()
context = ssl.SSLContext(protocol=ssl.PROTOCOL_TLS)
context.set_ecdh_curve('prime256v1')
ssock, address = self._server.accept()
ssock= context.wrap_socket(ssock, server_side=True)

使用此代码时,我收到错误:

啪。SSLError: [SSL: NO_SHARED_CIPHER] 没有共享密码

我尝试像下面这样设置密码:

context.set_ciphers('ECDHE-RSA-AES256-GCM-SHA384')

但是我尝试过的所有密码仍然会抛出相同的异常。

如果有人能指出我哪里出错或提供使用 DH SSL 的工作示例,将不胜感激!

TLS 密码定义了密钥交换、身份验证方法、对称加密算法和 HMAC。您明确尝试使用的密码中的身份验证方法是 RSA,即使用带有 RSA 公钥的证书。如果改为使用默认密码集,则身份验证方法是 RSA 或 ECDSA。

这两种身份验证方法都需要在服务器端使用适当的证书,即使用 RSA 或 ECC 公钥。由于您尚未配置任何证书,因此无法使用这些密码。这意味着从本质上讲,从客户端提供的密码(通常还需要基于证书的身份验证)来看,没有一个可用于连接,因此NO_SHARED_CIPHER。

您需要做什么:

  • 推荐的方法是在客户端信任的服务器上设置证书。请参阅SSLContext.load_cert_chain。
  • 或者,您可以使用不需要身份验证的密码,例如ADH-AES256-GCM-SHA384。请注意,您还需要在客户端中显式配置密码,因为默认情况下,出于安全原因,TLS 堆栈不使用未经身份验证的密码,因为不会以这种方式检测到中间人攻击。

相关内容

最新更新