Контекст SSL для более старой версии Python

У меня есть код, как показано ниже:

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)

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

Затем я поставил контрольно-пропускной пункт, у моего местного есть версия 2.7.10, но все производственные коробки имеют 2.7.3 с ними, так что SSLContext не поддерживается, и обновление версии Python не является опцией / в контроле.

Я попытался прочитать ssl - SSL-оболочку для объектов сокетов, но не смог понять из этого.

что я попробовал (напрасно):

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?

2 ответа

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

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

Вот пример того, как использовать их библиотеку.

>>> requests.get(uri)

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


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

>>> 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>

Изменить: Если вам нужно, вы также можете передать путь к сертификату и ключ, как это requests.get(uri, cert=('path/to/cert/abc.crt', 'path/to/key/abc.key'))


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

Другие вопросы по тегам