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

问题描述:

客户端和服务器都是内部的,每个客户端都有一个由内部CA和CA证书签名的证书。我需要客户端根据它拥有的CA证书来验证服务器的证书。它还应该将其证书发送到服务器进行身份验证。如何在没有(L)GPL库的情况下在Python中创建双重身份验证HTTPS客户端?

urllib2手册说没有执行服务器验证。 PycURL是一种天然替代品,但其许可证尚未获得批准。我也不希望从源代码编译库,而是使用RPM代替。

我去了一帮库像请求httplib2的并没有看到我需要什么。也有ssl模块,但我不觉得自己实施http,如果我不是绝对必须的。

的Python 2.6 RHEL 5.7

+0

我面对的几乎类似的问题,我的解决它让Apache做所有的SSL提升 – 2012-02-01 12:30:52

+0

@Mikko - 我的问题是在客户端,一个Python实用工具 – davka 2012-02-01 13:57:52

+0

啊哈。对不起,没有得到第一次:( – 2012-02-01 14:22:22

好吧,赢家(差不多)是httplib2 v0.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安装RPM。

+1

我希望我可以upvote这个答案更多我试过python请求,urllib3都没有成功,但这个工程!新的收藏图书馆。 – Komu 2014-11-28 10:10:55

Twisted Python是,可能你需要什么,尽管我不知道,如果MIT许可证适合你想要的库。 GPL是一个非常具体的许可证,希望你不是指“所有开源许可证”。

对于SSL示例,请参见http://twistedmatrix.com/documents/current/core/howto/ssl.html。根据您的描述,该页面上的最后几个示例尤其相关。 Twisted使用PyOpenSSLdocs),它已获得Apache许可。你也可以考虑直接使用PyOpenSSL。

+0

谢谢。它看起来很有趣,但对我来说似乎是一个矫枉过正的 - 我需要一个简单的请求和响应,所以在这种情况下,使用反应堆将过度工程 – davka 2012-02-02 09:14:04

+0

也许。感觉这个框架在一个块中太多了,请使用PyOpenSSL库(上面的链接)并手动完成。我想你会发现在任何情况下努力程度都是相似的。 – gfortune 2012-02-02 20:56:36

+0

我打算尝试'httplib2'看起来合适和简单,我会在这里更新它是怎么回事 – davka 2012-02-05 08:58:45

更新:如果requests之前并不支持客户端证书,it supports it now,提供的本地证书的私钥(如果有的话)是未加密:

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