如何检查ssl.SSLContext()配置,例如ALPN协议

mrwjdhj3  于 2023-05-18  发布在  其他
关注(0)|答案(1)|浏览(285)

我想正确配置SSLContext。某些设置可以使用方法进行检查,例如get_ciphers().其他的,比如那些由set_alpn_protocols()设置的,似乎没有相应的get方法。如何检查此类设置?
我试过使用inspect.getmembers(),但没有看到任何存储ALPN协议strlist的属性。set_alpn_protocols()的源代码似乎包含一个底层的C函数,但我对C不是很熟悉。

euoag5mw

euoag5mw1#

getter没有在python API中公开,这是一个经常出现的主题,通常使用python对OpenSSL进行 Package 。为此,您必须对SSLContext.set_alpn_protocols方法进行monkey-patch,以便将提供的alpn协议存储在示例属性(或其他地方)中。这样,您就可以从应用程序的其他部分访问它。示例:

from functools import wraps
from ssl import SSLContext, create_default_context

def wrapper(set_alpn_protocols):
    """
    Wrapper designed for SSLContext.set_alpn_protocols
    """
    @wraps(set_alpn_protocols)
    def new_setter(self, alpn_protocols):
        set_alpn_protocols(self, alpn_protocols)  # This has no return value
        self._alpn_protocols = alpn_protocols  # You can change the attr name if you want

    return new_setter

SSLContext.set_alpn_protocols = wrapper(SSLContext.set_alpn_protocols)
context = create_default_context()
context.set_alpn_protocols(['h2', 'http/1.1'])

# Now if the setter was ever used, you can access it through _alpn_protocols attribute
try:
    print(context._alpn_protocols)
except AttributeError:
    print('setter was not called')

输出

['h2', 'http/1.1']

相关问题