如何查看ssl.SSLContext()的配置信息,例如ALPN协议设置
如何查看SSLContext中已设置的ALPN协议列表?
由于Python标准库的ssl.SSLContext没有提供官方方法获取已设置的ALPN协议,你可以通过以下两种方式解决:
方法一:自定义SSLContext子类保存设置副本
这是最稳妥、兼容性最好的方案,通过重写set_alpn_protocols方法,在调用底层逻辑前把协议列表保存到实例属性中:
import ssl class TrackedSSLContext(ssl.SSLContext): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self._alpn_protocols = None def set_alpn_protocols(self, protocols): self._alpn_protocols = protocols.copy() super().set_alpn_protocols(protocols) # 使用示例 ctx = TrackedSSLContext(ssl.PROTOCOL_TLS_CLIENT) ctx.set_alpn_protocols(['http/1.1', 'h2']) print(ctx._alpn_protocols) # 输出: ['http/1.1', 'h2']
方法二:通过ctypes读取底层OpenSSL结构(兼容性有限)
如果不想修改原有代码结构,可以用ctypes直接解析OpenSSL的底层SSL_CTX结构,但注意不同OpenSSL版本的结构字段可能有差异,仅适合特定环境:
import ssl import ctypes from ctypes import c_void_p, c_char_p, POINTER # 适配OpenSSL 1.1.1的SSL_CTX结构(仅提取ALPN相关字段) class SSL_CTX(ctypes.Structure): _fields_ = [ ("alpn_protos", POINTER(c_char_p)), ("alpn_protos_len", ctypes.c_int), ] ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT) ctx.set_alpn_protocols(['http/1.1', 'h2']) # 转换底层CTX指针为自定义结构 ctx_ptr = ctypes.cast(ctx._ctx, POINTER(SSL_CTX)) # 读取并解码ALPN协议列表 alpn_protocols = [] for i in range(ctx_ptr.contents.alpn_protos_len): proto = ctx_ptr.contents.alpn_protos[i].decode('utf-8') alpn_protocols.append(proto) print(alpn_protocols) # 输出: ['http/1.1', 'h2']
为什么inspect.getmembers找不到相关属性?
因为ALPN协议列表仅存储在OpenSSL的底层C结构体中,Python的SSLContext对象没有将这个数据暴露为Python层面的属性,所以通过inspect工具无法直接获取。
内容的提问来源于stack exchange,提问作者enabtay0s9ex8dyq
相关产品推荐
相关产品推荐

