我需要在 Django 中进行 API 调用(某种形式),作为我们所需的自定义身份验证系统的一部分。用户名和密码通过 SSL 发送到特定 URL(对这些参数使用 GET),响应应该是 HTTP 200“OK”响应,其正文包含带有用户信息的 XML。
如果身份验证不成功,它将返回 HTTP 401“未经授权”响应。
出于安全原因,我需要检查:
- 请求是通过 HTTPS 连接发送的
- 服务器证书的公钥与预期值匹配(我使用“证书固定”来防御损坏的 CA)
在 python/django 中使用 pycurl/urllib2 或任何其他方法可以实现这一点吗?
最佳答案
使用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¶m2=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'
。
关于python - Django : Fetch XML, 中的 urllib2/pycurl 检查 HTTP 状态,检查 HTTPS 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8497079/