@alexandrsemen4ukk

Как отправить POST запрос в Python с использованием сертификата p12?

Нужна помощь в написании запроса, перепробовал все способы, которые удалось нагуглить. В моём случае они не работают, не проходят проверку сертификата, хотя с этим же сертификатом, но через PostMan я отправляю нормально запрос. Значит использую я https://api.developer.sber.ru/how-to-use/api_settings апи сбера.

Данный пример с использованием библиотеки requests_pkcs12 (без неё тоже самое)
from requests_pkcs12 import post

p12_certificate_path = "cert.p12"
certificate_password = b"пароль"  # тут пробовал и без преобразования в байт-код

url = 'https://mc.api.sberbank.ru/prod/tokens/v3/oauth'
payload = 'grant_type=client_credentials&scope=https://api.sberbank.ru/escrow'
headers = {
        'Authorization': 'Basic  clientId:clientSecret',  #Закодированные как требует того документация
        'RqUID': '3eEc70328e2CE4DF39e828E1dF75EFa0',
        'Content-Type': 'application/x-www-form-urlencoded'
    }
r = post(url, headers=headers, data=payload, pkcs12_filename=p12_certificate_path, pkcs12_password=certificate_password)


Данный код падает с ошибкой
ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1129)


Все другие способы, которые нашел с другими библиотеками и вручную - тоже самое возвращают.
До этого с сертификатами в запросах не работал, понятия не имею как в Python прикрутить сертификат и уж тем более p12. Пробовал аналогичные способы, разделяя p12 сертификат на cret.pem и private.pem - та же история.

Ещё такой вариант:
def test9():
    cert = 'certificate_2817b32a-2199-4126-b6e1-5a09dc7e1ade.crt.pem'
    key = 'certificate_2817b32a-2199-4126-b6e1-5a09dc7e1ade.key.pem'
    certificate_password = "myPass"

    payload = 'grant_type=client_credentials&scope=https://api.sberbank.ru/escrow'
    headers = {
        'Authorization': 'Basic *********************',
        'RqUID': '3eEc70328e2CE4DF39e828E1dF75EFa0',
        'Content-Type': 'application/x-www-form-urlencoded'
    }

    context = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
    context.load_cert_chain(cert, key, password=certificate_password)
    context.verify_mode = ssl.CERT_REQUIRED
    context.check_hostname = True

    conn = http.client.HTTPSConnection("mc.api.sberbank.ru", 443, context=context)

    conn.request("POST", "/prod/tokens/v3/oauth", payload, headers)
    print(conn.getresponse())
  • Вопрос задан
  • 468 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы