如何通过http.client.HTTPSConnection设置SNI

2024-09-29 23:26:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用http.client.HTTPSConnection生成到服务器的HTTPS连接。我无法使用原始主机名连接到服务器,因为这是一个测试设置,但我需要使用正确的主机名SNI进行正确的TLS握手。如何为HTTPS连接的客户端hello设置SNI

ssl.SSLSocket.server_hostname判断,如果我可以访问底层套接字,我应该能够将其上的服务器主机名设置为我想要的值HTTPSConnection确实有一个sock成员,但它在构造之后是None

如果更多的源代码上下文有帮助,我将在proxy-verifier中处理测试代理。见proxy_http1.py#L94


Tags: https服务器clienthttp客户端sslhelloserver
1条回答
网友
1楼 · 发布于 2024-09-29 23:26:38

在问题的评论部分,Steffen Ullrich引导我找到了答案。通过http.client.HTTPSConnection我试图做的事情没有直接的支持。但是,http.client.HTTPSConnection调用传入的SSLContext的ssl.SSLContext.wrap_socket函数。因此,通过为该类创建包装器,我能够得到我想要的东西。如果对其他人有帮助,我的代码现在看起来如下:

if scheme == 'https':
    if socket.client_sni:


        class WrapSSSLContext(ssl.SSLContext):
            '''
            HTTPSConnection provides no way to specify the
            server_hostname in the underlying socket. We
            accomplish this by wrapping the context to
            overrride the wrap_socket behavior (called later
            by HTTPSConnection) to specify the
            server_hostname that we want.
            '''
            def __new__(cls, server_hostname, *args, **kwargs):
                return super().__new__(cls, *args, *kwargs)


            def __init__(self, server_hostname, *args, **kwargs):
                super().__init__(*args, **kwargs)
                self._server_hostname = server_hostname


            def wrap_socket(self, sock, *args, **kwargs):
                kwargs['server_hostname'] = self._server_hostname
                return super().wrap_socket(sock, *args, **kwargs)


        proxy_to_server_context = WrapSSSLContext(socket.client_sni)
    else:
        proxy_to_server_context = ssl.SSLContext()
    self.tls.conns[origin] = http.client.HTTPSConnection(
            replay_server, timeout=self.timeout,
            context=proxy_to_server_context, cert_file=self.cert_file)

因此,如果我想指定SNI,我将使用定制的WrapSSSLContext类,它显式地提供我想要的服务器主机名。否则,我只使用标准ssl.SSLContext。我已经在数据包捕获中验证了这一点,它指定了我希望在客户端hello中使用的SNI

谢谢Steffen

相关问题 更多 >

    热门问题