Нужна помощь в написании запроса, перепробовал все способы, которые удалось нагуглить. В моём случае они не работают, не проходят проверку сертификата, хотя с этим же сертификатом, но через 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())