如何在Python中创建不依赖(L)GPL库的双重身份验证HTTPS客户端?

8 投票
3 回答
8526 浏览
提问于 2025-04-17 12:06

客户端和服务器都是内部的,每个都有一个由内部CA签发的证书和CA证书。我需要客户端用它拥有的CA证书来验证服务器的证书。同时,客户端也应该把自己的证书发送给服务器进行认证。

urllib2的手册上说不进行服务器认证。PycURL是一个不错的替代选择,但它的许可证还没有获得批准。我也更希望能直接使用RPM,而不是从源代码编译这个库。

我看过很多库,比如requestshttplib2,但没有找到我需要的功能。还有ssl模块,但如果不是绝对必要,我不想自己实现http。

我在RHEL 5.7上使用Python 2.6

3 个回答

3

更新:如果之前requests库不支持客户端证书,现在它已经支持了,前提是本地证书的私钥(如果有的话)是没有加密的:

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

Twisted Python 是一个库,可能能满足你的需求,不过我不太确定 MIT 许可证是否适合你。GPL 是一种比较特定的许可证,希望你不是指“所有开源许可证”。

如果你想看 SSL 的例子,可以去 http://twistedmatrix.com/documents/current/core/howto/ssl.html。那页最后几个例子特别符合你的描述。Twisted 使用的是 PyOpenSSL文档),它是用 Apache 许可证的。你也可以考虑直接使用 PyOpenSSL。

6

好吧,几乎可以说获胜者是 httplib2 版本0.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='' 这个参数,如果不加这个参数,我的代码就不管用了。

另外,遗憾的是,这个简单的解决方案对我来说不管用,因为我忘了提到一个额外的要求 - 需要在RHEL 5.7和Python 2.6上进行RPM安装。

撰写回答