Я пытаюсь использовать 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.