如何强制Python使用TLS1.2而非TLS1.3?已尝试方案无效
强制Python HTTPS请求使用TLS 1.2而非1.3失败排查
我需要强制Python发起HTTPS请求时将最高TLS版本限制为1.2(不使用1.3),但尝试多种方法后均未成功。通过https://www.howsmyssl.com/a/check接口检测客户端参数,运行平台为Win10。
已尝试的方案
方案一
class TLSv1_2HttpAdapter(HTTPAdapter): def init_poolmanager(self, connections, maxsize, block=False): ssl_context = ssl.create_default_context() ssl_context.minimum_version = ssl.TLSVersion.TLSv1 ssl_context.maximum_version = ssl.TLSVersion.TLSv1_2 ssl_context.options = ssl.PROTOCOL_TLS | ssl.OP_NO_TLSv1_3 self.poolmanager = PoolManager( num_pools=connections, maxsize=maxsize, block=block, ssl_version=ssl.PROTOCOL_TLS | ssl.OP_NO_TLSv1_3, ssl_context=ssl_context)
方案二
class TlsAdapter(HTTPAdapter): def __init__(self, ssl_options=0, **kwargs): self.ssl_options = ssl_options super(TlsAdapter, self).__init__(**kwargs) def init_poolmanager(self, *pool_args, **pool_kwargs): ctx = SSL.Context(SSL.TLSv1_2_METHOD) self.poolmanager = PoolManager(*pool_args, ssl_context=ctx, **pool_kwargs)
调用方式
s = requests.Session() s.mount('https://', TlsAdapter()) req = requests.Request('GET','https://www.howsmyssl.com/a/check') prepped = req.prepare() r = s.send(prepped, verify=False, proxies=proxies, allow_redirects=False ) print(ssl.OPENSSL_VERSION) print(r.json())
检测结果
OpenSSL 1.1.1k 25 Mar 2021 {'given_cipher_suites': ['TLS_AES_256_GCM_SHA384', 'TLS_CHACHA20_POLY1305_SHA256', 'TLS_AES_128_GCM_SHA256', 'TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384', 'TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384', 'TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256', 'TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256', 'TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256', 'TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256', 'TLS_DHE_RSA_WITH_AES_256_GCM_SHA384', 'TLS_DHE_RSA_WITH_AES_128_GCM_SHA256', 'TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256', 'TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8', 'TLS_ECDHE_ECDSA_WITH_AES_256_CCM', 'TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8', 'TLS_ECDHE_ECDSA_WITH_AES_128_CCM', 'TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384', 'TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384', 'TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256', 'TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256', 'TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA', 'TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA', 'TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA', 'TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA', 'TLS_DHE_RSA_WITH_AES_256_CCM_8', 'TLS_DHE_RSA_WITH_AES_256_CCM', 'TLS_DHE_RSA_WITH_AES_128_CCM_8', 'TLS_DHE_RSA_WITH_AES_128_CCM', 'TLS_DHE_RSA_WITH_AES_256_CBC_SHA256', 'TLS_DHE_RSA_WITH_AES_128_CBC_SHA256', 'TLS_DHE_RSA_WITH_AES_256_CBC_SHA', 'TLS_DHE_RSA_WITH_AES_128_CBC_SHA', 'TLS_RSA_WITH_AES_256_GCM_SHA384', 'TLS_RSA_WITH_AES_128_GCM_SHA256', 'TLS_RSA_WITH_AES_256_CCM_8', 'TLS_RSA_WITH_AES_256_CCM', 'TLS_RSA_WITH_AES_128_CCM_8', 'TLS_RSA_WITH_AES_128_CCM', 'TLS_RSA_WITH_AES_256_CBC_SHA256', 'TLS_RSA_WITH_AES_128_CBC_SHA256', 'TLS_RSA_WITH_AES_256_CBC_SHA', 'TLS_RSA_WITH_AES_128_CBC_SHA', 'TLS_EMPTY_RENEGOTIATION_INFO_SCSV'], 'ephemeral_keys_supported': True, 'session_ticket_supported': True, 'tls_compression_supported': False, 'unknown_cipher_suite_supported': False, 'beast_vuln': False, 'able_to_detect_n_minus_one_splitting': False, 'insecure_cipher_suites': {}, 'tls_version': 'TLS 1.3', 'rating': 'Probably Okay'}
问题
请问我哪里操作出错了?
内容的提问来源于stack exchange,提问作者zhenya_hacker
相关产品推荐
相关产品推荐

