2009-12-09 5 views
16

Мне нужно создать безопасный канал между моим сервером и удаленной веб-службой. Я буду использовать HTTPS с сертификатом клиента. Мне также нужно будет проверить сертификат, предоставленный удаленной службой.Использование клиентских сертификатов с urllib2

  1. Как я могу использовать свой собственный сертификат клиента с urllib2?

  2. Что мне нужно сделать в моем коде, чтобы убедиться, что удаленный сертификат верен?

ответ

29

Поскольку ответ Алекса ссылку, и код на этой странице, плохо отформатирован, я просто хочу, чтобы поставить это здесь для потомства: ответ

import urllib2, httplib 

class HTTPSClientAuthHandler(urllib2.HTTPSHandler): 
    def __init__(self, key, cert): 
     urllib2.HTTPSHandler.__init__(self) 
     self.key = key 
     self.cert = cert 

    def https_open(self, req): 
     # Rather than pass in a reference to a connection class, we pass in 
     # a reference to a function which, for all intents and purposes, 
     # will behave as a constructor 
     return self.do_open(self.getConnection, req) 

    def getConnection(self, host, timeout=300): 
     return httplib.HTTPSConnection(host, key_file=self.key, cert_file=self.cert) 

opener = urllib2.build_opener(HTTPSClientAuthHandler('/path/to/file.pem', '/path/to/file.pem.')) 
response = opener.open("https://example.org") 
print response.read() 
+0

Большое вам спасибо за это! Я отслеживал ошибку в течение нескольких дней с помощью частного сертификата и центра сертификации для подключения к серверу Apache, используя библиотеку запросов в python. Я мог проверить, работает ли мой сертификат в браузере, однако он каждый раз терпел неудачу с «ошибкой рукопожатия». Я закончил использование класса выше, чтобы доказать, что клиентский сертификат работает и проверяет подлинность. Оказалось, что в версии библиотеки запросов я использовал ошибку 1.2.3, если быть точным. Надеюсь, этот комментарий поможет другим людям, которые сталкиваются с одной и той же проблемой. – ihatecache

+0

Я новичок в Python, поэтому хотел бы знать, когда здесь называется функция https_open()? Если возможно, опишите, каков поток выполнения этого кода? – rrsuj

+0

Итак, я следил за этими инструкциями, и я получаю ошибку urlopen: «ssl certificate verify failed» при использовании python 2.7.9 или выше. Я считаю, что мне нужно добавить SSLContext со своей собственной цепочкой сертификатов, но я не уверен на 100%, не возражаете ли вы давать какие-либо советы или подсказки для работы в этом примере. Благодаря! – macguru2000

1

Per Антуана Pitrou в к проблеме, связанной с ответом Хэнка Гея, это может быть упрощено несколько (по состоянию на 2011 г.) с помощью прилагаемого ssl библиотеки:

import ssl 
import urllib.request 

context = ssl.create_default_context() 
context.load_cert_chain('/path/to/file.pem', '/path/to/file.key') 
opener = urllib.request.build_opener(urllib.request.HTTPSHandler(context=context)) 
response = opener.open('https://example.org') 
print(response.read()) 

(код Python 3, но библиотека ssl также доступна в Python 2).

Функция load_cert_chain также принимает необязательный параметр пароля, позволяя шифровать секретный ключ.