1

有什么方法可以使用requests库实现 OCSP 检查?

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

然后,那里有这样的实现吗?您是否已经解决并愿意报告它?

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

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

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

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

4

2 回答 2

2

从对 pyOpenSSL 和 M2Crypto 的简要了解来看,我怀疑它们是否为 OCSP 验证提供了必要的功能,并且我看不到任何为 python 实现此类东西的认真尝试,另请参见http://www.gossamer-threads.com/lists/python /错误/1092384

实现 OCSP 绝对不是一件容易的事情。OpenSSL API 未记录在案,您必须从源代码中提取必要的部分。然后,您必须尝试将它们组合在一起并从中制作一个界面,该界面实际上可供最终用户使用。

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

它不仅仅是蟒蛇。如果您查看工具和编程语言,其中很多工具和编程语言在正确验证证书的基本任务中都失败了,那就是检查 CA,不要忘记根据给定的主机名检查证书内的名称。他们中的大多数要么不做 OCSP,要么只提供类似 OpenSSL 的 API,而这种 API 并不能以简单的方式真正使用。

于 2014-09-13T03:22:40.027 回答
1

实际上 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()
于 2018-06-29T19:29:55.393 回答