Django中的urllib2 / pycurl:获取XML,检查HTTP状态,检查HTTPS连接

时间:2011-12-13 22:25:14

标签: python django ssl-certificate urllib2 pycurl

我需要在Django中进行API调用(作为我们需要的自定义身份验证系统的一部分)。用户名和密码通过SSL发送到特定URL(对于这些参数使用GET),响应应该是HTTP 200“OK”响应,主体包含带有用户信息的XML。

在不成功的身份验证中,它将返回HTTP 401“未经授权”的响应。

出于安全考虑,我需要检查:

  1. 请求是通过HTTPS连接发送的
  2. 服务器证书的公钥与预期值匹配(我使用'证书固定'来防止损坏的CA)
  3. 使用pycurl / urllib2或任何其他方法在python / django中是否可以这样做?

2 个答案:

答案 0 :(得分:3)

使用M2Crypto

from M2Crypto import SSL
ctx = SSL.Context('sslv3')
ctx.set_verify(SSL.verify_peer | SSL.verify_fail_if_no_peer_cert, depth=9)
if ctx.load_verify_locations('ca.pem') != 1:
   raise Exception('No CA certs')

c = SSL.Connection(ctx)
c.connect(('www.google.com', 443)) # automatically checks cert matches host
c.send('GET / \n')
c.close()

使用urllib2_ssl(不言而喻,但要明确:使用它需要您自担风险):

import urllib2, urllib2_ssl

opener = urllib2.build_opener(urllib2_ssl.HTTPSHandler(ca_certs='ca.pem'))
xml = opener.open('https://example.com/').read()

相关:Making HTTPS Requests secure in Python

使用pycurl

c = pycurl.Curl()
c.setopt(pycurl.URL, "https://example.com?param1=val1&param2=val2")
c.setopt(pycurl.HTTPGET, 1)
c.setopt(pycurl.CAINFO, 'ca.pem')
c.setopt(pycurl.SSL_VERIFYPEER, 1)
c.setopt(pycurl.SSL_VERIFYHOST, 2)
c.setopt(pycurl.SSLVERSION,     3)    
c.setopt(pycurl.NOBODY, 1)
c.setopt(pycurl.NOSIGNAL, 1)
c.perform()
c.close()

实施“证书固定”可为不同的域提供不同的'ca.pem'

答案 1 :(得分:0)

httplib2可以使用证书验证执行https请求:

import httplib2
http = httplib2.Http(ca_certs='/path/to/cert.pem')
try:
    http.request('https://...')
except httplib2.SSLHandshakeError, e:
    # do something

确保您的httplib2是最新的。我的发行版附带的那个(ubuntu 10.04)没有ca_certs参数。

同样与你的问题there is an example of certificate validation with pycurl