You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何查看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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 01:45:34