Ошибка с помощью HTTPSConnection httlib с сертификатом PKCS#12

Я пытаюсь использовать HTTPSConnection httplib для клиентской проверки, с помощью сертификата № 12 PKCS. Я знаю, что сертификат хорош, поскольку я могу соединиться с сервером с помощью него в 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 ошибка. Вот вся ошибка traceback:

  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 ошибка (последняя запись в списке) примечания "lib PEM", который я нашел нечетным, так как я не пытаюсь использовать сертификат PEM.

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

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

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

Править: Файл сертификата содержит и сертификат и закрытый ключ, который является, почему я обеспечиваю то же имя файла и для key_file HTTPSCONNECTION и для cert_file параметров.

5
задан kennytm 1 October 2010 в 16:16
поделиться

1 ответ

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

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

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

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

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

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

4
ответ дан 14 December 2019 в 04:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: