OpenSSL SSL:CERTIFCATE_VERIFY_FAILED
Я пытаюсь отправить запрос на получение URL-адреса https, на котором есть успокаивающий API, который ответит изображением, которое я хочу сохранить. Я использую Python 3.5 на Windows и запросы lib, чтобы сделать запрос https.
Я нахожусь в сети, в которой каждому пользователю выдается сертификат pcks#12(.p12), и я должен установить его в своем браузере, чтобы посетить практически любые веб-страницы в сети, включая сайт, на который я нацеливаюсь. Через мой браузер я могу получить доступ к целевому веб-сайту и загрузить изображение по желанию. Однако сделать это программно было непросто.
Я продолжаю получать ошибку SSL: CERTIFICATE_VERIFY_FAILED. Я не могу скопировать всю трассировку (на другом компьютере), но ниже приводится краткое изложение того, что выкладывается в консоли Python.
ssl.py, строка 628, в do_handshake ssl.SSLError [SSL: CERTIFICATE_VERIFY_FAILED] проверка сертификата не удалась (_ssl.c:645)
Во время обработки вышеупомянутого исключения произошло другое исключение: запросы \adapters.py, строка 447, в send*
поднять SSLError(e, request=request) request.exceptions.SSLError: сбой проверки сертификата [SSL: CERTIFICATE_VERIFY_FAILED] (_ssl.c:645)
Вот мой код Я конвертирую из.p12 в.pem, потому что считаю, что этого требует библиотека запросов.
Password = bytes(r'blahblahblah','utf-8')
P12 = OpenSSL.crypto.load_pkcs12(open("C:/Temp/certs/mypki.p12",'rb').read(),password)
key = OpenSSL.crypto.dump_privatekey(OpenSSL.crypto.FILETYP_PEM, p12.get_privatekey())
mycert = OpenSSL.crypto.dump_certificate(OpenSSL.crypto.FILETYP_PEM, p12.get_certificate())
#len(get_ca_certificates) return 2 so I know I've got all of them
cert1 = OpenSSL.crypto.dump_certificate(OpenSSL.crypto.FILETYP_PEM, p12.get_ca_certificates()[0])
cert2 = OpenSSL.crypto.dump_certificate(OpenSSL.crypto.FILETYP_PEM, p12.get_ca_certificates()[1])
В какой-то момент я получал сообщения о том, что у меня было ключевое несоответствие. Этот код привел меня к открытию, что метод get_certificate() возвращает сертификат, не найденный в кортеже, возвращенном методом get_ca_certificate(). Какой был открытый ключ, соответствующий моему личному ключу. Я просто включил это, чтобы люди знали, что я получил подходящую пару ключей.
k = OpenSSl.crypto.Load_privatekey(OpenSSL.crypto.FILETYPE_PEM,key)
c = OpenSSl.crypto.Load_certificate(OpenSSL.crypto.FILETYPE_PEM,mycert)
context = OpenSSL.SSL.Context(OpenSSL.SSL.TLSv1_1_METHOD)
context.use_privatekey(k)
context.use_certificate(c)
try:
context.check_privatekey()
return True
except OpenSSL.SSL.Error:
return FALSE
Я решил создать файл.pem с моим ключом и сертификатами в одном файле. Я также пытался отделить ключ от сертификатов в разных файлах, но при этом получал ту же ошибку. Я не уверен на 100% о различиях между.pem,.crt и т. Д. И о том, когда их использовать, но думаю, что я делаю это правильно...?
pem_file = open("C:/Temp/Certs/cert.pem","wb")
pem_file.write(key)
pem_file.write(mycert)
pem_file.write(cert1)
pem_file.write(cert2)
pem_file.close()
response = request.get("https://somewebsite.com",proxies={"http": None,
"https:": None}, cert=("C:/Temp/Certs/cert.pem"))
Для полноты картины этот код я использовал, когда пытался выписать ключ и сертификаты для отдельных файлов.
response = request.get("https://somewebsite.com",proxies={"http": None,
"https:": None}, cert=("C:/Temp/Certs/cert.crt" , "C:/Temp/Certs/key.key"))
1 ответ
Таким образом, проблема закончилась тем, что я использовал неправильный файл pcks#12. Мне дали digital_signature.p12 и encryption_key.p12 (или что-то в этом роде), и веб-сайт ожидал закрытый ключ и сертификаты от digital_signature.p12 вместо другого, который я использовал.