如何在Python请求库中添加OCSP支持?

时间:2014-09-12 07:57:25

标签: python python-3.x python-requests ocsp

有没有办法用 requests 库实现OCSP检查?

我现在看到的唯一可行方法是使用pyOpenSSL,但这意味着必须与服务器建立单独的独立连接以获取证书,然后连接到颁发者进行验证。

然后,那里有没有这样的实现? 你有没有解决它,并关心报告它?

M2Crypto看起来似乎至少是SSL连接的候选者,但我不确定该库可能存在的缺点,但它看起来比requests更低级别肯定的。

旁注:
显然,当谈到更复杂的HTTP / HTTPS连接时,Python真的很糟糕。

urllib甚至不检查SSL / TLS证书,而requests附带自己的CA证书集合(而不是使用系统的CA),似乎不支持代理配置通过PAC。

哎呀,我甚至尝试过使用Qt的HTTP堆栈(使用操作系统设置)但遇到了多个并发连接的停滞问题。

2 个答案:

答案 0 :(得分:2)

简单介绍一下pyOpenSSL和M2Crypto我怀疑它们是否为OCSP验证提供了必要的功能,我看不出任何为python实现此类事情的认真尝试,另请参阅http://www.gossamer-threads.com/lists/python/bugs/1092384

实施OCSP绝对不是一件容易的事。 OpenSSL API未记录,您必须从源代码中提取必要的部分。然后你必须尝试将它们放在一起并从中创建一个接口,这实际上可供最终用户使用。

  

显然,当谈到更复杂的HTTP / HTTPS连接时,Python真的很糟糕。

这不仅仅是python。如果你看一下工具和编程语言,很多都会在正确验证证书的基本任务中失败,那就是检查CA并且不要忘记根据给定的主机名检查证书中的名称。而且他们中的大多数要么不做OCSP,要么只提供类似OpenSSL的API,而这些API并不是真正可用的简单方法。

答案 1 :(得分:0)

实际上,OpenSSL确实支持OCSP。我实际上可以使用SSL.Connection打开套接字,但是然后,我的问题是在该套接字上建立了实际的HTTP连接。

我不知道这是否有帮助 实际上,OpenSSL确实支持OCSP。我实际上可以使用SSL.Connection打开套接字,但是然后,我的问题是在该套接字上建立了实际的HTTP连接。

使用以下代码,您可以打开ocsp连接并执行整个ocsp握手。下一步是从中创建一个http连接

ssl_context = Context(tls_method)
ssl_context.use_certificate_file(clientcert)
ssl_context.use_privatekey_file(clientkey)
ssl_context.load_verify_locations(cafile=None, capath=trusted_ca)
ssl_context.set_verify(VERIFY_PEER | VERIFY_FAIL_IF_NO_PEER_CERT |VERIFY_CLIENT_ONCE, callback=self.verify_callback)
ssl_context.set_ocsp_client_callback(
        callback=self.ocsp_callback, data=None)
tcp_conn = socket.create_connection((host, port))
ssl_conn = Connection(ssl_context, tcp_conn)
ssl_conn.set_tlsext_host_name(host.encode())
ssl_conn.request_ocsp()
ssl_conn.set_connect_state()
ssl_conn.do_handshake()