Есть ли способ обрабатывать обновления CRL без создания нового сокета

#python-3.x #sockets #ssl

Вопрос:

Я пытаюсь создать сервер сокетов, который включает в себя CRL, клиенты поддерживают соединение с сокетом, поэтому перезапуск или сброс сокета сервера разъединяет всех клиентов. Я хотел бы поддерживать CRL, однако я не хочу перезапускать сервер каждый раз, когда CRL обновляется, чтобы сбросить сокет. Кто-нибудь знает способ обновить существующий ssl-сокет?

Код сервера:

 
import socket, ssl

from certvalidator import CertificateValidator, ValidationContext

context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
context.verify_flags = ssl.VERIFY_CRL_CHECK_LEAF
context.verify_mode = ssl.CERT_REQUIRED
context.load_verify_locations(cafile=r"path to ca with crl appended")

context.load_cert_chain(r"path to crt", r"path to key", password='pass') ###############
bindsocket = socket.socket()
bindsocket.bind(('', 9000))
bindsocket.listen(5)

while True:
    newsocket, fromaddr = bindsocket.accept()
    sslsoc = context.wrap_socket(newsocket, server_side=True)
    request = sslsoc.read()
    print(request)
 

Код клиента:

 import socket
import ssl
hostname = '127.0.0.1'
context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
context.load_verify_locations(cafile="path to CA")
context.load_cert_chain(r"path to cer", r"path to key", password='pass')
context.check_hostname = False
with socket.create_connection((hostname, 8089)) as sock:
    with context.wrap_socket(sock) as ssock:
        print(ssock.version())
        ssock.do_handshake()
        print('connected')
        ssock.send(b'122222')
        while True:
            header = ssock.recv(4)
            print(header)
            data = ssock.recv(10000)
            print(header   data)
            print(len(data))
            print()

 

Ответ №1:

В bindsocket первую очередь, изменение CRL не влияет на серверный сокет, поскольку это обычный TCP-сокет. Все, что нужно изменить, — это контекст SSL context , и это можно сделать в любое время без каких-либо изменений, необходимых для bindsocket этого . Новый контекст SSL с измененным URL-адресом затем будет использоваться для следующего клиента при использовании TLS-квитирования context.wrap_socket .

перезапуск или сброс сокета сервера разъединяет все клиенты

Это неправда. Прослушиватель bindsocket и клиентское соединение newsocket независимы друг от друга, т. е. закрытие bindsocket не влияет на newsocket . Конечно, перезапуск полного серверного приложения отключит всех клиентов, так как закрытие приложения закроет все сокеты.

Комментарии:

1. Я обновил свой код, поскольку он не отражал мою реальную проблему, мне нужно обновить контекст сокета сервера, и в моем реальном случае использования у меня нет контроля над клиентом. Проблема в том, что если я закрою обернутый сокет сервера, то клиент отключится, и даже тогда я не смогу повторно использовать исходный сокет TCP с обновленным контекстом.

2. @user210328: Пожалуйста, не меняйте вопрос существенно после того, как на него был дан ответ. Я ответил на вопрос так, как он был задан. Если вы хотели спросить что-то по-другому, пожалуйста, задайте новый вопрос и не превращайте свой вопрос в движущуюся цель. Вот почему я откатил вашу правку, чтобы отразить то, что было первоначально отвечено.