2016-03-16 9 views
7

У меня есть код, как показано ниже:SSL контекст для старых питона версии

headers = {'content-type': 'ContentType.APPLICATION_XML'} 
uri = "www.client.url.com/hit-here/" 
clientCert = "path/to/cert/abc.crt" 
clientKey = "path/to/key/abc.key" 
PROTOCOL = ssl.PROTOCOL_TLSv1 
context = ssl.SSLContext(PROTOCOL) 
context.load_default_certs() 
context.load_cert_chain(clientCert, clientKey) 
conn = httplib.HTTPSConnection(uri, some_port, context=context) 

Я не являюсь на самом деле сетевым программистом, так что я сделал некоторые прибегая к помощи для подключения рукопожатия и нашел ssl.SSLContext(PROTOCOL) как необходимую функцию, код работает отлично ,

Затем я попал в блокпост, у меня в локальной версии версия 2.7.10, но у всех ящиков для производства есть 2.7.3, поэтому SSLContext не поддерживается и обновление версии python не является опцией/в управлении.

Я пробовал читать ssl — SSL wrapper for socket objects, но не мог понять.

, что я пытался (напрасно):

s_ = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s = ssl.wrap_socket(s_, keyfile=clientKey, certfile=clientCert, cert_reqs=ssl.CERT_REQUIRED) 
new_conn = s.connect((uri, some_port)) 

но возвращается:

SSLError(1, u'[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:590)') 

Вопрос - как генерировать SSL контекст на старую версию, чтобы иметь безопасную HTTPS связь?

+1

Я не думаю, что старая версия может работать с контекстом. Пробовали ли вы создать соединение https с указанием сертификатов, т. Е. Conn = httplib.HTTPSConnection (хост, порт, key_file, cert_file, строгий, таймаут) –

ответ

0

Вы должны указать файл ca_certs (который должен указывать доверять магазин)

+0

вы можете уточнить бит? – NoobEditor

+0

Чтобы доверять серверному сертификату, вам необходимо указать ca_certificate сервера. Таким образом, ваш wrap_socket должен быть похож на ssl.wrap_socket (s_, keyfile = clientKey, certfile = clientCert, ca_certs = cacertfile cert_reqs = ssl.CERT_REQUIRED) –

0

У меня есть идеальное решение, используя requests library. Библиотека запросов - это моя любимая библиотека, которую я когда-либо использовал, потому что в Python требуется что-то очень сложное - запросы SSL и REST - и делает ее невероятно простой. Я проверил поддержку их версий и поддерживал Python 2.6+.

Вот пример использования их библиотеки.

>>> requests.get(uri) 

И это все, что вам нужно. Библиотека запросов выполняет поиск соединения ssl.


Принимая это на шаг дальше. Если вам нужно сохранить cookie между запросами, вы можете сделать это так.

>>> sess = requests.Session() 
>>> credentials = {"username": "user", 
        "password": "pass"} 
>>> sess.post("https://some-website/login", params=credentials) 
<Response [200]> 
>>> sess.get("https://some-website/a-backend-page").text 
<html> the backend page... </html> 

Edit: Если вы хотите, вы можете также pass in the path to the certificate and the key как так requests.get(uri, cert=('path/to/cert/abc.crt', 'path/to/key/abc.key'))


Теперь, надеюсь, вы можете убедить их установить библиотеку запросов на производство коробок, потому что это было бы это того стоит. Дайте мне знать, если это сработает для вас.

+0

request.get не поддерживает зашифрованные ключи, а документы request.post не имеют сертификата/ключевая документация ... любые мысли друг? – NoobEditor

+0

Dang it.Ну, я не могу думать о других способах этого, но если да, я дам вам знать. –

 Смежные вопросы

  • Нет связанных вопросов^_^