python - Django : Fetch XML, 中的 urllib2/pycurl 检查 HTTP 状态,检查 HTTPS 连接

标签 python django ssl-certificate urllib2 pycurl

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

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

出于安全原因,我需要检查:

  1. 请求是通过 HTTPS 连接发送的
  2. 服务器证书的公钥与预期值匹配(我使用“证书固定”来防御损坏的 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&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'

关于python - Django : Fetch XML, 中的 urllib2/pycurl 检查 HTTP 状态,检查 HTTPS 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8497079/

相关文章:

python - 如何在带有嵌入式大括号的 Python 中创建多行字典值?

python - Django - 限制查看项目的用户

https - 鱿鱼 SSL 碰撞 3.5.4 : error - Error negotiating SSL connection on FD 10: Success (0)

php - 通过 htaccess 文件强制 http 到 https,不起作用

python - 限制使用 numpy.genfromtxt 为 matplotlib 读取多少数据

python,import ssl 和 import _ssl 的区别

django - 如何正确扩展 django 用户模型

facebook - 开发中的 Localhost 应用程序是否需要 Secure Canvas URL

python - SummaryWriter 不在 TensorFlow 中输出图形

python - 在 Django 应用程序中集成和使用旧版 Mysql 数据库