Я пытаюсь использовать 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 параметров.
В списке рассылки 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 для настройки связанного сертификат.
(Я пробовал первое, но не смог заставить его работать. Это не обязательно означает, что это не сработает; только то, что я не смог.)