Как создать HTTPS-клиент с двойной аутентификацией в Python без (L) библиотек GPL? - PullRequest
6 голосов
/ 01 февраля 2012

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

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

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

Python 2.6 на RHEL 5.7

Ответы [ 3 ]

6 голосов
/ 12 февраля 2012

хорошо, победитель (почти) - 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.

3 голосов
/ 02 февраля 2012

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

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

2 голосов
/ 24 августа 2016

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

>>> requests.get('https://FOO.BAR.BAZ/', cert=('/path/client.cert', '/path/client.key'))
<Response [200]>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...