有没有办法在不创建新套接字的情况下处理 CRL 更新
Posted
技术标签:
【中文标题】有没有办法在不创建新套接字的情况下处理 CRL 更新【英文标题】:Is there a way to process CRL updates without creating a new socket 【发布时间】:2021-08-18 18:44:57 【问题描述】:我正在尝试创建一个包含 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
进行任何更改。然后,在使用 context.wrap_socket
进行 TLS 握手时,具有更改 URL 的新 SSL 上下文将用于下一个客户端。
重新启动或重置服务器套接字会断开所有客户端的连接
这不是真的。监听器bindsocket
和客户端连接newsocket
是相互独立的,即关闭bindsocket
对newsocket
没有影响。当然,重新启动整个服务器应用程序会断开所有客户端,因为关闭应用程序会关闭所有套接字。
【讨论】:
我已经更新了我的代码,因为它没有反映我的真正问题,我需要更新服务器套接字上下文,而在我的实际用例中,我无法控制客户端。问题是如果我关闭包装的服务器套接字然后客户端断开连接,即使这样我也无法使用更新的上下文重用原始 TCP 套接字。 @user210328:请不要在回答后大幅更改问题。我已经回答了被问到的问题。如果您想提出不同的问题,请提出一个新问题,不要让您的问题成为移动目标。这就是为什么我回滚了您的编辑以反映最初的回答。以上是关于有没有办法在不创建新套接字的情况下处理 CRL 更新的主要内容,如果未能解决你的问题,请参考以下文章
C# 中有没有办法在不使调用者也异步的情况下调用异步方法? [复制]