urllib2 / pycurl в Django: извлечение XML, проверка статуса HTTP, проверка соединения HTTPS - PullRequest
1 голос
/ 14 декабря 2011

Мне нужно сделать вызов API (в некотором роде) в Django, как часть пользовательской системы аутентификации, которая нам нужна. Имя пользователя и пароль отправляются на определенный URL-адрес через SSL (с использованием GET для этих параметров), и ответ должен быть HTTP-ответом «ОК» с кодом 200, тело которого содержит XML с информацией о пользователе.

При неудачной авторизации возвращается HTTP 401 «Неавторизованный» ответ.

В целях безопасности мне нужно проверить:

  1. Запрос отправлен по HTTPS-соединению
  2. Открытый ключ сертификата сервера соответствует ожидаемому значению (я использую «закрепление сертификата» для защиты от сломанных ЦС)

Возможно ли это в python / django, используя pycurl / urllib2 или любой другой метод?

Ответы [ 2 ]

3 голосов
/ 14 декабря 2011

Использование 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()

Связанный: Обеспечение безопасности запросов HTTPS в 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' для разных доменов.

0 голосов
/ 14 декабря 2011

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.

Также в вопросе, аналогичном вашему , приведен пример проверки сертификата с помощью pycurl .

...