OpenSSL SSL: CERTIFCATE_VERIFY_FAILED

56
4

Я пытаюсь выдать запрос на получение https-url, у которого есть успокоительный 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)

Во время обработки вышеуказанного исключения произошло другое исключение: request\adapters.py, строка 447, в send *

поднять запрос SSLError (e, 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"))

спросил(а) 2020-03-25T21:31:30+03:00 5 месяцев, 3 недели назад
1
Решение
112

Таким образом, проблема закончилась тем, что я использовал неправильный файл pcks # 12. Мне дали digital_signature.p12 и encryption_key.p12 (или что-то в этом роде), и веб-сайт ожидал секретный ключ и сертификаты от digital_signature.p12 вместо другого, который я использовал.

ответил(а) 2020-03-25T21:48:41.823754+03:00 5 месяцев, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема