#python #api #ssl #zeep
#питон #API #ssl #зип
Вопрос:
У меня огромная проблема с авторизацией моего запроса API. Я использую python 3.10. Для настройки клиента у меня есть следующий код:
from zeep import exceptions, helpers from requests import Session from zeep.transports import Transport from zeep import Client def login(register): ....... elif register == 'XXX': authTok = '' #only for coherence wsdl_path = r"path_to_my_wsdl.wsdl" url = urllib.parse.urljoin('file:', urllib.request.pathname2url(os.path.abspath(wsdl_path))) session = Session() session.verify = False session.cert = (r'path_to_my_cert.pem') client = Client(wsdl=url, transport=Transport(session=session)) return client, authTok
Затем я использовал приведенный ниже код, чтобы получить клиента:
client, authTok = login('XXX') search = {} search['sort'] = {'sort_att': 'number', 'sort_asc': 'True'} search['criterion'] = {'search_range': 'RP', 'id': '123456789'}
До этого шага ошибок не было. И, наконец, я попытался отправить свой запрос следующим образом: r = client.service.searchcompany(params=search)
Вот у меня такая ошибка:
ssl.SSLError: [SSL: CA_MD_TOO_WEAK] ca md too weak (_ssl.c:3862)
С помощью openssl я создал новый сертификат:
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out mycert.pem -sha256 -days 365 -nodes
В качестве вывода я получил два файла: ключ.пем и микерт.пем. С помощью команды certifi.where()
я нашел местоположение моего файла cacert.pem и вставил в него содержимое файла mycert.pem.
К сожалению, ошибка все еще возникает. Кто-нибудь может объяснить, что я делаю не так?
Комментарии:
1. Один дополнительный вопрос. session.cert = (r’path_to_my_cert.pem’) и сертификат из папки certifiразличны. session.cert-это сертификат, предоставленный владельцем API. Я не обратил на это внимания, но в таком коде (с session.cert, определенным как внешний) используется ли этот внешний сертификат вместо сертификата от certifi?
Ответ №1:
В моем случае было полезно понизить версию python до 3.8.8. Это решило мою ошибку.