如何在没有(L)GPL库的Python中创建双身份验证HTTPS客户端



客户端和服务器都是内部的,每个都有一个由内部CA和CA证书签名的证书。我需要客户端根据它拥有的CA证书来验证服务器的证书。它还应该将其证书发送到服务器进行身份验证。

urlib2手册指出,不执行服务器身份验证PycURL是一个自然的替代方案,但其许可证尚未获得批准。我也希望不必从源代码编译库,而是使用RPM。

我浏览了一堆库,比如请求httplib2,但没有发现我需要什么。还有ssl模块,但如果不是绝对必须的话,我不想自己实现http。

RHEL 5.7 上的Python 2.6

好吧,(几乎)赢家是httplib2v0.7。从这个版本开始,它支持SSL证书身份验证。这是的样本代码

import httplib2
client = httplib2.Http(ca_certs='ca.crt')
client.add_certificate(key='client_private_key.pem', cert='cert_client.pem', domain='')
headers, resp = client.request(query)

注意domain=''参数,否则它对我不起作用。

PS。不幸的是,这个简单的解决方案对我来说不起作用,因为我忘了提到额外的要求——安装RHEL 5.7&Python 2.6。

Twisted Python是一个可以满足您需要的库,尽管我不确定MIT许可证是否符合您的要求。GPL是一个非常具体的许可证,希望你不是指"所有开源许可证"

有关SSL示例,请参阅http://twistedmatrix.com/documents/current/core/howto/ssl.html.根据你的描述,该页面上的最后几个例子特别相关。Twisted使用PyOpenSSL(docs),它是用Apache许可证授权的。您也可以考虑直接使用PyOpenSSL。

更新:如果请求以前不支持客户端证书,它现在支持它,前提是本地证书的私钥(如果有的话)是未加密的:

>>> requests.get('https://FOO.BAR.BAZ/', cert=('/path/client.cert', '/path/client.key'))
<Response [200]>

最新更新