Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x python TLS套接字中的TLS会话恢复_Python 3.x_Sockets_Session_Ssl_Tls1.2 - Fatal编程技术网

Python 3.x python TLS套接字中的TLS会话恢复

Python 3.x python TLS套接字中的TLS会话恢复,python-3.x,sockets,session,ssl,tls1.2,Python 3.x,Sockets,Session,Ssl,Tls1.2,我有一个简单的python TLS客户机,它连接到TLS服务器。我无法控制服务器。我需要与每台服务器进行新的TLS握手,即使我最近访问过它 1) 默认情况下,非浏览器TLS客户端(如以下python客户端)是否执行会话恢复 2) 我怎么知道他们是做还是不做?如果在后台执行会话恢复,如何禁用会话恢复 请注意,我为连接到的每个新域创建了一个新套接字 import socket, ssl context = ssl.SSLContext() context.verify_mode = ssl.CE

我有一个简单的python TLS客户机,它连接到TLS服务器。我无法控制服务器。我需要与每台服务器进行新的TLS握手,即使我最近访问过它

1) 默认情况下,非浏览器TLS客户端(如以下python客户端)是否执行会话恢复

2) 我怎么知道他们是做还是不做?如果在后台执行会话恢复,如何禁用会话恢复

请注意,我为连接到的每个新域创建了一个新套接字

import socket, ssl

context = ssl.SSLContext() 
context.verify_mode = ssl.CERT_NONE 
context.check_hostname = False 

mycipher = "DHE-RSA-AES128-SHA"
context.set_ciphers(mycipher) 
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
domain = "google.com"
mySocket = context.wrap_socket(sock, server_hostname = domain) 
mySocket.connect((domain, 443))
mySocket.close()

这是一个困难但有趣的问题。你确实使用了一个恰当的术语TLS,它给我带来了快乐;-)

首先,请注意TLS1.3中的会话恢复已更改,因此这可能会影响您将来的工作(至少在TLS1.3之前的命名中,此功能更多地说明了会话和票证,而TLS1.3更倾向于说明预共享密钥):

现在谈谈你的问题:

1) 默认情况下,非浏览器TLS客户端(如以下python客户端)是否执行会话恢复?
  • 位于的Python文档没有提到任何关于“恢复”的内容;我认为,如果它什么也没说,它根本就没在做。但它确实提到了“缓存”,它可能是一个同义词
  • 实际上,您可以注意到会话具有以下属性:
    ticket\u lifetime\u hint
    has\u ticket
    ;这应该与收地有关
  • 现在查看,如果浏览所有可能的值,您将得到:

    ssl.OP\u无票据
    阻止客户端请求会话票证

  • 因此,我在1)中的假设可能是错误的,默认情况下您有会话恢复。您应该使用上述选项禁用它

  • (相反)它似乎存在于
    PyOpenSSL
    (与股票
    ssl
    )中,因为这里甚至有一个关于如何为该库禁用此功能的问题:

  • 根据经验,您可以尝试通过以这样的方式运行您的应用程序,使其在短时间内两次连接到同一端点,并查看交换的是哪种TLS消息。例如,在TLS 1.3中(应与其他版本类似,但某些名称可能会更改),新的握手从
    ClientHello
    /
    ServerHello
    开始,其中恢复从相同的消息开始,但使用
    pre_shared_key
    扩展名。它的存在将显示TLS恢复。在TLS1.2中,客户端将在恢复握手期间发送一个
    SessionTicket
    扩展
  • 2) 我怎么知道他们是做还是不做?如果在后台执行会话恢复,如何禁用会话恢复?
  • 如果我对上述内容的理解正确,请确保在ssl上下文对象中使用
    ssl.OP_NO_TICKET
    。否则,默认情况下它是
    OP_ALL
    ,这是一个包含各种选项的包,旨在最大限度地提高互操作性,但内容可能会根据您的Python版本和使用的底层OpenSSL库而变化
  • 如果您的会话已填充
    has_ticket
    属性,我猜它将使用TLS恢复或设置为使用它
  • 1) 默认情况下,非浏览器TLS客户端(如以下python客户端)是否执行会话恢复

    默认情况下,python tls/ssl库不执行会话恢复

    2) 我怎么知道他们是做还是不做?如果在后台执行会话恢复,如何禁用会话恢复

    您可以使用以下代码验证会话是否未恢复:

    import socket
    import ssl
    
    hostname = 'www.stackoverflow.com'
    context = ssl.create_default_context()
    
    # Create a new socket, then create a secure socket
    sock = socket.create_connection((hostname, 443))
    ssock = context.wrap_socket(sock, server_hostname=hostname)
    
    # Was the TLS Session re-used?
    print(ssock.session_reused) # False
    

    谢谢还有一件事。如果客户端使用
    设置\u密码
    更改其密码套件。i、 例如,客户端使用密码电路与服务器进行第一次握手,然后客户端使用
    set\u ciphers
    更改其密码电路,然后客户端与同一服务器进行第二次握手(就在第一次握手之后)。仍然可以使用会话恢复吗?客户端更改密码是否强制执行新的握手?这对我来说有点棘手,所以我会感谢你的帮助。我说的是TLS 1.2。你能检查一下我的问题吗?你从哪里得到的印象是你可以随时更改密码?的确,消息名为ChangeCipherSpec,但这只是在握手开始时交换,而不是在飞行中交换。参见TLS1.2:在安全参数达成一致后,但在发送验证完成消息之前,在握手过程中发送ChangeCipherSpec消息。非常感谢您的帮助。你能检查一下我的后续问题吗?