#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: Пожалуйста, не меняйте вопрос существенно после того, как на него был дан ответ. Я ответил на вопрос так, как он был задан. Если вы хотели спросить что-то по-другому, пожалуйста, задайте новый вопрос и не превращайте свой вопрос в движущуюся цель. Вот почему я откатил вашу правку, чтобы отразить то, что было первоначально отвечено.