我正在编写一个需要在客户端浏览器中安装证书的应用程序。我在“上下文”对象的 PyOpenSSL 文档中找到了这一点,但我看不到任何关于回调应该如何验证证书的信息,只是它应该以某种方式验证。
set_verify(模式,回调) 将此 Context 对象的验证标志设置为 mode 和 指定回调应该用于验证回调。 模式应该是 VERIFY_NONE 和 VERIFY_PEER 之一。如果 使用 VERIFY_PEER,模式可以是 OR:ed VERIFY_FAIL_IF_NO_PEER_CERT 和 VERIFY_CLIENT_ONCE 进一步 控制行为。回调应该有五个参数:A 连接对象、一个 X509 对象和三个整数变量, 依次是潜在错误数、错误深度和返回 代码。如果验证通过,回调应该返回 true 并且 否则为假。
我告诉 Context 对象我的(自签名)密钥在哪里(见下文),所以我想我不明白为什么这还不足以让库检查客户端提供的证书是否有效。在这个回调函数中应该做什么?
class SecureAJAXServer(PlainAJAXServer):
def __init__(self, server_address, HandlerClass):
BaseServer.__init__(self, server_address, HandlerClass)
ctx = SSL.Context(SSL.SSLv23_METHOD)
ctx.use_privatekey_file ('keys/server.key')
ctx.use_certificate_file('keys/server.crt')
ctx.set_session_id("My_experimental_AJAX_Server")
ctx.set_verify( SSL.VERIFY_PEER | SSL.VERIFY_FAIL_IF_NO_PEER_CERT | SSL.VERIFY_CLIENT_ONCE, callback_func )
self.socket = SSL.Connection(ctx, socket.socket(self.address_family, self.socket_type))
self.server_bind()
self.server_activate()
警告:在这里编码是为了好玩,绝对不是专业人士,所以如果我的 Q 揭示了我对 SSL 的完全跛足、幼稚和/或根本缺乏理解,请不要太粗鲁!
谢谢 :)
罗杰