SSL в Python: почему он не отправляет сертификат на сервер? - PullRequest
2 голосов
/ 25 июня 2011

Я пишу некоторое программное обеспечение, которое должно получать информацию с защищенной SSL веб-страницы.Ниже приведен фрагмент кода, который я использую для подключения к серверу.

s = socket.socket (socket.AF_INET, socket.SOCK_STREAM)
ssl_sock = ssl.wrap_socket (
    s,
    ca_certs = '/home/stilz/Desktop/Certyfikaty/GLOWNE_CA.cer',
    cert_reqs = ssl.CERT_REQUIRED,
    ssl_version = ssl.PROTOCOL_SSLv3,
)
ssl_sock.connect ((HOST, PORT))

Однако это не работает.Выдает исключение с сообщением «Сбой оповещения о рукопожатии».Я перехватил некоторые TCP-пакеты, которые приходят из моего скрипта, а также соответствующие пакеты из Internet Explorer и выяснил, что мой скрипт вообще не отправляет сертификат (сервер возвращает что-то вроде «Fatal: сертификат не предоставлен»), в то время как IE отправляет его нормально.Насколько я знаю, файл ca.cer является сертификатом x509 (начиная с "----- BEGIN CERTIFICATE -----").

Пожалуйста, помогите мне и расскажите, что я делаю неправильно.Если я предоставил немного информации, пожалуйста, дайте мне знать.

С уважением

Ответы [ 2 ]

1 голос
/ 25 июня 2011

Прежде всего, вам необходимо определить, нужно ли вам проходить аутентификацию на сервере (сертификат отправляется на сервер только в этом случае) или вам нужно проверить подлинность сервера (в этом случае сертификат не отправляется на сервер).server).

Теперь о проблемах в вашем коде:

Случай 1: вам не нужно проходить аутентификацию на сервере.В этом случае вам не нужно указывать свой сертификат, и на сервер ничего не отправляется.

Случай 2: вам нужно аутентифицировать себя на сервере.В этом случае вам необходимо предоставить свой сертификат и файл личного ключа в параметрах keyfile и certfile.Только тогда ваш сертификат отправляется на сервер (а закрытый ключ используется при рукопожатии).

Полагаю, у вас есть случай 1 на самом деле.Поэтому прежде всего вам необходимо проверить, предоставляет ли сервер действительный сертификат, подключившись к нему через веб-браузер и проверив цепочку сертификатов сайта.Может случиться, что сайт отправит свой сертификат, но пропустит промежуточные сертификаты CA.

В любом случае я хотел бы напомнить о обсуждении сертификатов в документации по Python , которое я предлагаю вам перечитать.

0 голосов
/ 25 июня 2011

Если сервер запрашивает (и требует) сертификат для отправки клиентом, вам необходимо предоставить ssl.wrap_socket путь к вашему сертификату (certfile) и соответствующий ему закрытый ключ ( keyfile). Параметр ca_certs используется только для проверки клиентом сертификата сервера по известным сертификатам CA, он не имеет отношения к отправке сертификата клиента.

Возможно, вам потребуется экспортировать клиентский сертификат и закрытый ключ из IE (а затем преобразовать их в формат PEM).

...