我正在编写一个需要在客户端浏览器中安装证书的应用程序。我在PyOpenSSL文档中找到了有关“Context”对象的内容,但我没有看到有关回调函数如何验证证书的任何信息,只是说它应该以某种方式进行验证。
set_verify(mode, callback) 将此上下文对象的验证标志设置为mode,并指定应将callback用于验证回调。 mode应为VERIFY_NONE和VERIFY_PEER之一。如果使用VERIFY_PEER,则可以使用 VERIFY_FAIL_IF_NO_PEER_CERT和VERIFY_CLIENT_ONCE与mode进行OR:运算,以进一步控制行为。 回调函数应该接受五个参数:连接对象、X509对象和三个整数变量,依次为潜在的错误号码、 错误深度和返回代码。如果验证通过,则回调应返回true;否则返回false。
我告诉了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()
注意:我这里只是为了好玩而编码,绝不是专业人士,因此如果我的问题揭示出我在SSL方面的完全无能、幼稚和/或基本缺乏理解,请不要太苛刻!
谢谢:)
Roger
set_verify
并具有完全相同的安全特性。问题是ok
实际上是预验证的“返回代码”(即VERIFY_PEER | VERIFY_FAIL_IF_NO_PEER_CERT | VERIFY_CLIENT_ONCE
的结果),但是在回调中没有实现客户端证书验证 - 它只是原样返回。如果您不尝试实际实现客户端身份验证验证,则可以只执行ctx.verify_mode
而不是ctx.set_verify
。 - Stofctx.verify_mode = ssl.CERT_NONE
替换ctx.setverify(...)
(并删除不再需要的verify_callback()
),正如这个答案中所指出的:https://dev59.com/L2Ik5IYBdhLWcg3wdd0l#28048260 - aculich