Как создать HTTPS-клиент с двойной аутентификацией в Python без (L)GPL-библиотек?

И клиент, и сервер являются внутренними, каждый имеет сертификат, подписанный внутренним центром сертификации, и сертификат центра сертификации. Мне нужен клиент для проверки подлинности сертификата сервера по сертификату CA, который он имеет. Он также должен отправить свой сертификат на сервер для аутентификации.

В руководстве urllib2 говорится, что аутентификация сервера не выполняется. PycURL является естественной альтернативой, но ее лицензия еще не утверждена. Я также предпочел бы не компилировать библиотеку из исходного кода, а вместо этого использовать RPM.

Я просмотрел кучу библиотек, таких как запросы, httplib2 и не вижу, что мне нужно. Существует также модуль ssl, но я не чувствую, что сам реализую http, если не буду этого делать.

Python 2.6 на RHEL 5.7

3 ответа

Решение

Ну, победитель (почти) - httplib2 v0.7. Начиная с этой версии он поддерживает аутентификацию SSL-сертификата. Вот пример кода

import httplib2
client = httplib2.Http(ca_certs='ca.crt')
client.add_certificate(key='client_private_key.pem', cert='cert_client.pem', domain='')
headers, resp = client.request(query)

Обратите внимание domain='' параметр, у меня не получилось иначе.

PS. к сожалению, это простое решение не работает для меня, так как я забыл упомянуть дополнительное требование - установка RPM для RHEL 5.7 и Python 2.6.

Обновление: если запросы ранее не поддерживали сертификаты на стороне клиента, теперь он поддерживает их при условии, что закрытый ключ локального сертификата (если есть) не зашифрован:

>>> requests.get('https://FOO.BAR.BAZ/', cert=('/path/client.cert', '/path/client.key'))
<Response [200]>

Twisted Python - это библиотека, которая может делать то, что вам нужно, хотя я не уверен, что лицензия MIT соответствует вашим требованиям. GPL - довольно специфическая лицензия, и, надеюсь, вы не имели в виду "все лицензии с открытым исходным кодом".

Примеры SSL см. По http://twistedmatrix.com/documents/current/core/howto/ssl.html. Последние пару примеров на этой странице особенно актуальны на основе вашего описания. Twisted использует PyOpenSSL ( docs), который лицензируется по лицензии Apache. Вы можете рассмотреть возможность использования PyOpenSSL напрямую.

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