Python搭建Gemini服务器:如何忽略客户端自签名证书的SSL验证?
解决Python Gemini服务器中自签名客户端证书验证失败问题
问题核心:使用ssl.create_default_context(ssl.Purpose.CLIENT_AUTH)创建的上下文,会默认用系统信任根证书验证客户端证书——即使设置了CERT_OPTIONAL,只要客户端发送了证书,就会校验其是否在信任链中,自签名证书自然会触发ssl.SSLCertVerificationError。
解决方案:自定义SSL验证回调
通过自定义验证回调,跳过“证书是否被信任”的检查,仅验证证书本身的有效性(如签名正确、未过期),符合Gemini协议对客户端证书的要求。
修改后的代码示例:
... self.context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH) self.context.load_cert_chain(certfile=certfile, keyfile=keyfile) self.context.verify_mode = ssl.CERT_OPTIONAL # 关闭主机名检查(Gemini协议不需要验证客户端证书的主机名) self.context.check_hostname = False def verify_client_cert(cert, errnum, errdepth, ok): # 仅当证书本身无错误(签名、有效期正常)时接受,忽略信任链验证失败 return errnum == 0 self.context.verify_callback = verify_client_cert ...
说明
verify_callback会在客户端证书验证的每个阶段被调用,errnum为0表示证书本身格式、签名、有效期均正常,仅因不在信任链中导致验证失败。- 若完全跳过所有验证(仅限测试场景),可直接在回调中返回
True,但这会接受无效证书,不符合生产环境要求。
内容的提问来源于stack exchange,提问作者Lualt
相关产品推荐
相关产品推荐

