如何在服务器上加载多个SSL证书与Python套接字

oxf4rvwz  于 2023-10-19  发布在  Python
关注(0)|答案(1)|浏览(109)

我正在创建一个应该支持SSL的服务器。我有两对签名证书和密钥文件,用于两个不同的域。
为了将这两个证书添加到上下文中,我尝试了两件事:

  • 两次呼叫context.load_cert_chain(certfile=certfile, keyfile=keyfile)
  • 将证书文件和密钥文件连接为一个证书文件和一个密钥文件

两次尝试都没有成功,因为服务器似乎只使用其中一次。我的理解是,我可以使用服务器名称指示(SNI)在同一IP中拥有两个域证书。
如何使服务器名称指示(SNI)与python ssl一起工作?我想浏览器应该把这些信息发送到服务器,让服务器知道应该提供什么证书。如何在调用context.wrap_socket(csock, server_side=True)之前知道客户端需要什么证书?

h9a6wy2h

h9a6wy2h1#

我找到了答案:
你需要为sni设置一个回调:

self.context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH)
self.context.sni_callback = self.sni_callback

[...]

def sni_callback(self, sslsocket: ssl.SSLSocket, sni_name: str, sslcontext: ssl.SSLContext) -> None:
        if sni_name in self.certs:
            print(f"\tSNI: {sni_name}")
            new_context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH)

            certfile, keyfile = self.certs[sni_name]
            new_context.load_cert_chain(certfile=certfile, keyfile=keyfile)
            sslsocket.context = new_context

        return None

相关问题