我想知道为什么没有一种简单的方法来查找特定 ssl 上下文支持的密码? (还是我错过了)
我知道我们可以使用
socket.cipher()
来获取用于特定 socket
连接的密码,但为什么不使用某种方法来获取所有受支持的密码呢?
另一件事是,
我有一台运行 openssl 库的服务器,其中包含密码字符串
"HIGH+TLSv1.2:!MD5:!SHA1"
。客户端是一个使用 ssl
库的 python 文件,具有默认选项,建立连接后 socket.cipher()
显示以下元组
('DHE-RSA-AES256-GCM-SHA384', 'TLSv1/SSLv3', 256)
当我明确提到 TLSv1.2 时,如何与 TLSv1 建立连接?当 TLSv1 不支持高于
SHA384
的任何内容时,如何使用 SHA1
?
我想知道为什么没有一种简单的方法来查找特定 ssl 上下文支持的密码? (还是我错过了)
仅 OpenSSL 1.1.0 添加了函数 SSL_CTX_get_ciphers 来访问此列表,并且此功能在 Python 中尚不可用。
('DHE-RSA-AES256-GCM-SHA384', 'TLSv1/SSLv3', 256)
当我明确提到 TLSv1.2 时,如何使用 TLSv1 建立连接?当 TLSv1 不支持高于 SHA1 的任何内容时,如何使用 SHA384?
根据源代码 Python 使用 SSL_CIPHER_get_version 来查找版本字符串。匹配的 OpenSSL 文档 表示 OpenSSL 1.0.2:
SSL_CIPHER_get_version() 返回字符串,指示首先定义密码的 SSL/TLS 协议版本。 目前是 SSLv2 或 TLSv1/SSLv3。在某些情况下,它可能应该返回“TLSv1.2”,但不会返回;使用 SSL_CIPHER_description()
因此,这是 OpenSSL 中的一个错误,根据 OpenSSL 1.1.0 中相同功能的文档,该错误已在最新的 OpenSSL 版本中修复。
SSLContext.get_ciphers()
是在Python 3.4中添加的。
Python 3.11.6 (main, Oct 2 2023, 13:45:54) [Clang 15.0.0 (clang-1500.0.40.1)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import ssl
>>> from pprint import pprint
>>> pprint(ssl.create_default_context().get_ciphers()[0])
{'aead': True,
'alg_bits': 256,
'auth': 'auth-any',
'description': 'TLS_AES_256_GCM_SHA384 TLSv1.3 Kx=any Au=any '
'Enc=AESGCM(256) Mac=AEAD',
'digest': None,
'id': 50336514,
'kea': 'kx-any',
'name': 'TLS_AES_256_GCM_SHA384',
'protocol': 'TLSv1.3',
'strength_bits': 256,
'symmetric': 'aes-256-gcm'}
>>> pprint(sorted([cipher['name'] for cipher in ssl.create_default_context().get_ciphers()]))
['DHE-RSA-AES128-GCM-SHA256',
'DHE-RSA-AES128-SHA256',
'DHE-RSA-AES256-GCM-SHA384',
'DHE-RSA-AES256-SHA256',
'ECDHE-ECDSA-AES128-GCM-SHA256',
'ECDHE-ECDSA-AES128-SHA256',
'ECDHE-ECDSA-AES256-GCM-SHA384',
'ECDHE-ECDSA-AES256-SHA384',
'ECDHE-ECDSA-CHACHA20-POLY1305',
'ECDHE-RSA-AES128-GCM-SHA256',
'ECDHE-RSA-AES128-SHA256',
'ECDHE-RSA-AES256-GCM-SHA384',
'ECDHE-RSA-AES256-SHA384',
'ECDHE-RSA-CHACHA20-POLY1305',
'TLS_AES_128_GCM_SHA256',
'TLS_AES_256_GCM_SHA384',
'TLS_CHACHA20_POLY1305_SHA256']
>>>