如何使用python检索CN支持的TLS版本和支持的密码

如何使用python检索CN支持的TLS版本和支持的密码,python,ssl,Python,Ssl,我得到的结果只是最新支持的TLS版本(TLS 1.3),我想打印所有支持的TLS版本,如TLS 1.2、TLS 1.1等 from urllib.request import Request, urlopen, ssl, socket from urllib.error import URLError, HTTPError import json #some site without http/https in the path base_url = 'googl

我得到的结果只是最新支持的TLS版本(TLS 1.3),我想打印所有支持的TLS版本,如TLS 1.2、TLS 1.1等

from urllib.request import Request, urlopen, ssl, socket
    from urllib.error import URLError, HTTPError
    import json
    #some site without http/https in the path
    base_url = 'google.com'
    port = '443'`enter code here`
    
    hostname = base_url
    context = ssl.create_default_context()
    
    with socket.create_connection((hostname, port)) as sock:
        with context.wrap_socket(sock, server_hostname=hostname) as ssock:
            print(ssock.version())
            data = json.dumps(ssock.getpeercert())
            
    
    #print (data)

TLS客户端无法查询服务器所支持的内容。TLS客户端只能提供有关密码、TLS版本、曲线等的服务,然后尝试使用此服务与服务器进行SSL握手。如果成功,则服务器支持此特定组合

但这也意味着TLS客户端必须首先支持这种特定的组合。例如,如果服务器仍然支持RC4密码(不安全),但客户端TLS堆栈不支持它,则SSL握手也将失败-如果TLS堆栈允许握手首先使用不受支持的密码开始。大多数现代的TLS堆栈实际上禁用了这种不安全的密码,或者甚至不再编译它们,这意味着需要使用自己的TLS库编译,并支持旧的密码和TLS版本

因此,您可以迭代所有TLS版本,并使用此特定TLS版本创建一个新上下文-请参阅哪个版本具有
协议
参数

然后,您还需要设置要在此上下文中测试的特定密码。有关这些密码的名称以及如何指定它们,请参阅,您也可以运行
openssl ciphers-V
来检查哪些密码被编译到特定版本的openssl中。还请注意,并非所有密码都可以与所有TLS协议版本结合使用,但这也有文档记录

如果TLS握手成功,您至少知道支持此特定组合。如果失败,则并不意味着在所有情况下都不支持它,因为由于DH密钥弱、曲线不受支持、服务器需要客户端证书等原因,也可能存在握手问题。。。i、 你的任务绝不是微不足道的