我正在尝试使用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)


使用此代码时,出现错误:

ssl.SSLError:[SSL:NO_SHARED_CIPHER]没有共享密码

我尝试过如下设置密码:

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


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

如果有人指出我出了问题的地方或提供使用DH SSL的有效示例,将不胜感激!

最佳答案

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

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

你需要做什么:


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

09-10 05:29
查看更多