Python 支持 ssl 获取密码

Python ssl get ciphers supported

我想知道为什么没有一种简单的方法来查找特定 ssl 上下文支持的密码? (还是我错过了)

我知道我们可以使用 socket.cipher() 来获得用于特定 socket 连接的密码,但为什么不使用某些东西来获得所有支持的密码呢?

另一件事是,

我有一个服务器,它是 运行 带有密码字符串 "HIGH+TLSv1.2:!MD5:!SHA1" 的 openssl 库。客户端是一个使用 ssl 库的 python 文件,具有默认选项,并且在建立连接后 socket.cipher() 显示下面的元组

('DHE-RSA-AES256-GCM-SHA384', 'TLSv1/SSLv3', 256)

当我明确提到 TLSv1.2 时,如何与 TLSv1 建立连接,以及它如何使用 SHA384,而 TLSv1 不支持高于 SHA1 的任何东西?

I was wondering why isn't there a simple way to find the ciphers supported by a particular ssl context? (Or did I miss it)

只有 OpenSSL 1.1.0 添加了一个函数 SSL_CTX_get_ciphers 来访问此列表,而此功能在 Python 中尚不可用。

('DHE-RSA-AES256-GCM-SHA384', 'TLSv1/SSLv3', 256)

How is the connection established with TLSv1, when I explicitly mentioned TLSv1.2, and how is it using SHA384, when TLSv1 doesn't have support for anything higher then SHA1?

根据 the source code Python is using SSL_CIPHER_get_version to find out the version string. The matching OpenSSL documentation 对于 OpenSSL 1.0.2 的说法:

SSL_CIPHER_get_version() returns string which indicates the SSL/TLS protocol version that first defined the cipher. This is currently SSLv2 or TLSv1/SSLv3. In some cases it should possibly return "TLSv1.2" but does not; use SSL_CIPHER_description()

因此,这是 OpenSSL 中的一个错误,根据 OpenSSL 1.1.0 中相同功能的文档,它已在最新的 OpenSSL 版本中修复。