Ошибка при использовании HTTPSConneb с помощью сертификата PKCS # 12 - PullRequest
5 голосов
/ 13 апреля 2010

Я пытаюсь использовать HTTPSConnection httplib для проверки клиента, используя сертификат PKCS # 12. Я знаю, что сертификат хорош, поскольку я могу подключиться к серверу, используя его в MSIE и Firefox.

Вот моя функция подключения (сертификат включает в себя закрытый ключ). Я сократил это до основ:

def connect(self, cert_file, host, usrname, passwd):
    self.cert_file = cert_file
    self.host = host

    self.conn = httplib.HTTPSConnection(host=self.host, port=self.port, key_file=cert_file, cert_file=cert_file)

    self.conn.putrequest('GET', 'pathnet/,DanaInfo=200.222.1.1+')
    self.conn.endheaders()
    retCreateCon = self.conn.getresponse()

    if is_verbose:
        print "Create HTTPS connection, " + retCreateCon.read()

(Примечание: нет комментариев к жестко закодированному пути, пожалуйста - сначала я пытаюсь заставить это работать; я сделаю это довольно впоследствии. Закрепленный путь верен, когда я подключаюсь к нему в MSIE и Firefox. Я изменил IP-адрес для сообщения.)

Когда я пытаюсь запустить это, используя сертификат PKCS # 12 (файл .pfx), я получаю сообщение об ошибке openSSL. Вот полная трассировка ошибки:

  File "Usinghttplib_Test.py", line 175, in 
    t.connect(cert_file=opts["-keys"], host=host_name, usrname=opts["-username"], passwd=opts["-password"])
  File "Usinghttplib_Test.py", line 40, in connect
    self.conn.endheaders()
  File "c:\python26\lib\httplib.py", line 904, in endheaders
    self._send_output()
  File "c:\python26\lib\httplib.py", line 776, in _send_output
    self.send(msg)
  File "c:\python26\lib\httplib.py", line 735, in send
    self.connect()
  File "c:\python26\lib\httplib.py", line 1112, in connect
    self.sock = ssl.wrap_socket(sock, self.key_file, self.cert_file)
  File "c:\python26\lib\ssl.py", line 350, in wrap_socket
    suppress_ragged_eofs=suppress_ragged_eofs)
  File "c:\python26\lib\ssl.py", line 113, in __init__
    cert_reqs, ssl_version, ca_certs) ssl.SSLError: [Errno 336265225] _ssl.c:337: error:140B0009:SSL routines:SSL_CTX_use_PrivateKey_file:PEM lib

Обратите внимание, что ошибка openSSL (последняя запись в списке) указывает на "PEM lib", что показалось мне странным, поскольку я не пытаюсь использовать сертификат PEM.

Для ударов я преобразовал сертификат PKCS # 12 в сертификат PEM и запустил тот же код, используя , что . В этом случае я не получил ошибку, мне было предложено ввести пароль PEM, и код попытался связаться с сервером. (Я получил ответ "Сервис не имеется в наличии. Пожалуйста, попробуйте позже. ", Но я полагаю, что это произошло бы потому, что сервер не принимает сертификат PEM. Я не могу подключиться в Firefox к серверу, используя сертификат PEM.)

Предполагается, что HTTPSConnection httplib поддерживает сертификаты PCKS # 12? (То есть, файлы pfx.) Если так, почему похоже, что openSSL пытается загрузить его внутри библиотеки PEM? Я все делаю неправильно?

Любой совет приветствуется.

EDIT: файл сертификата содержит как сертификат, так и закрытый ключ, поэтому я предоставляю одно и то же имя файла для параметров key_file и cert_file HTTPSConnection.

Ответы [ 2 ]

4 голосов
/ 21 декабря 2011

Это не удивительно. Справочные документы библиотеки Python достаточно ясны по этому поводу. От http://docs.python.org/library/httplib.html:

class httplib. HTTPSConnection (host [, port [, key_file [, cert_file [, строго [, timeout [, source_address]]]]]])

Подкласс HTTPConnection, который использует SSL для связи с защищенными серверами. Порт по умолчанию - 443. key_file - это имя файла в формате PEM , в котором содержится ваш закрытый ключ. Файл cert_file представляет собой формат PEM файл цепочки сертификатов.

4 голосов
/ 15 апреля 2010

В списке рассылки openSSL я поболтал с Муниром Идрасси. Он отметил, что openSSL поддерживает файлы PKCS # 12, и - исходя из полученного сообщения об ошибке - кажется, что httplib вызывает неправильную функцию для загрузки ключа.

По его словам:

"Что касается получаемой ошибки, то похоже, что используемый вами модуль phython вызывает SSL_CTX_use_PrivateKey_file, присваивая ему имя файла PKCS # 12. Это не потому, что SSL_CTX_use_PrivateKey_file принимает только два формата: SSL_FILETYPE_PEM и SSL_FILETYPE_AS 1005 *

(я даю httplib имя файла PKCS # 12 в качестве файла ключа, поскольку этот формат файла включает в себя как сертификат, так и закрытый ключ в одном файле.)

"Чтобы исправить это, у вас есть два решения: - Либо подпишите модуль python с закрытым ключом в файле PEM. - Или измените исходный код этого модуля python, чтобы использовать функции PKCS # 12, о которых я упоминал выше, для извлечения закрытого ключа как EVP_PKEY, а затем вызвать SSL_use_PrivateKey вместо SSL_CTX_use_PrivateKey_file вместе с SSL_use_certificate для установки соответствующего сертификата. "

(Я попробовал первый и не смог заставить его работать. Это не обязательно означает, что он не сработает; только то, что я не смог.)

...