客户端和服务器都是内部的,每个客户端都有一个由内部CA和CA证书签名的证书。我需要客户端根据它拥有的CA证书验证服务器的证书。它还应将其证书发送到服务器进行身份验证。
urllib2 手册说明未执行服务器身份验证。 PycURL 是一种天然的选择,但其许可证尚未获得批准。我也不想从源代码编译库,而是使用RPM。
我浏览了一堆像 requests , httplib2 这样的库,看不到我需要的东西。还有 ssl 模块,但如果我不是绝对必须,我不想自己实现http。
RHEL 5.7上的Python 2.6
答案 0 :(得分:6)
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安装RPM& Python 2.6。
答案 1 :(得分:3)
Twisted Python是一个可以满足您需求的库,虽然我不确定MIT许可证是否符合您的要求。 GPL是一个非常具体的许可证,希望你不是指“所有开源许可证。”
有关SSL示例,请参阅http://twistedmatrix.com/documents/current/core/howto/ssl.html。根据您的描述,该页面上的最后几个示例特别相关。 Twisted使用获得Apache许可证的PyOpenSSL(docs)。您也可以考虑直接使用PyOpenSSL。
答案 2 :(得分:2)
更新:如果requests之前不支持客户端证书it supports it now,前提是本地证书的私钥(如果有)未加密:
>>> requests.get('https://FOO.BAR.BAZ/', cert=('/path/client.cert', '/path/client.key'))
<Response [200]>