有没有办法在不创建新套接字的情况下处理 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 是相互独立的,即关闭bindsocketnewsocket 没有影响。当然,重新启动整个服务器应用程序会断开所有客户端,因为关闭应用程序会关闭所有套接字。

【讨论】:

我已经更新了我的代码,因为它没有反映我的真正问题,我需要更新服务器套接字上下文,而在我的实际用例中,我无法控制客户端。问题是如果我关闭包装的服务器套接字然后客户端断开连接,即使这样我也无法使用更新的上下文重用原始 TCP 套接字。 @user210328:请不要在回答后大幅更改问题。我已经回答了被问到的问题。如果您想提出不同的问题,请提出一个新问题,不要让您的问题成为移动目标。这就是为什么我回滚了您的编辑以反映最初的回答。

以上是关于有没有办法在不创建新套接字的情况下处理 CRL 更新的主要内容,如果未能解决你的问题,请参考以下文章

C# 中有没有办法在不使调用者也异步的情况下调用异步方法? [复制]

如何在不创建新文件的情况下使用 ffmpeg/avconv 更改元数据?

在不取消当前 SQL 语句的情况下创建新的 SQL 语句

ffmpeg:在不创建新文件的情况下向 mp4 添加字幕

如何在不裁剪的情况下调整新图像对象的大小?

有没有办法在不将 dtype 更改为对象的情况下将 NaT 附加到带有时区的 pandas 日期时间?