Как выполнить проверку подлинности с помощью модуля запросов с использованием хранилища доверенных сертификатов?

В настоящее время я пишу плагин языка python для компилятора, который я написал, который автоматизирует http-вызовы API RESTful. Мне удалось получить логин / аутентификацию, работающую с использованием модулей socket и ssl, но этот подход низкого уровня, похоже, создает потенциальные проблемы с синтаксическим анализом ответа, чтобы получить токен аутентификации и секрет. Модуль запросов кажется популярным / эффективным, однако я не могу заставить его функционировать должным образом для моих конкретных потребностей в проверке подлинности. Я использую хранилище доверия в форме файла .pem (содержащий только открытый ключ), который я преобразовал из моего .jks-файла, используемого для аутентификации для плагина Java. Сервер ожидает, что имя пользователя и пароль будут отправлены в тело запроса в формате json. Вот код, который я пытался использовать:

#Server and login data ... host = 'localhost' port = 8443 pem_file = "C:\\Users\\aharasta\\pycert.pem" #Digest password with MD5 algorithm m = hashlib.md5() m.update(password) encrypted_password = m.hexdigest() url = <url> data = {'userid': user_name, 'password': encrypted_password} json_data = json.dumps(data) headers = {'Content-type': 'application/json', 'Accept': 'text/plain', 'Content \ Length': len(json_data)} r = requests.post(url, headers = headers, data = json_data, cert = pem_file) print(r) 

После выполнения этого кода повышается ошибка SSL, указывающая, что «проверка сертификата не удалась». Если я добавлю параметр verify = pem_file verify = False или verify = pem_file , я получу 404 ответ от сервера. Следует также отметить, что, когда я запускаю сервер в режиме отладки и выполняю запрос (с одним из параметров проверки), он никогда не делает его аутентификационными методами сервера или любыми методами. Любое понимание или помощь по этому вопросу были бы очень признательны!

One Solution collect form web for “Как выполнить проверку подлинности с помощью модуля запросов с использованием хранилища доверенных сертификатов?”

Сначала есть пара проблем с тем, что вы опубликовали:

  • Вы указываете host и port но не указываете пример url , поэтому мы можем предположить, что вы используете локальное развертывание для тестирования и можете фактически просматривать запросы на сервер. Я не уверен, о каких методах вы говорите, но если вы используете что-то похожее на Flask для разработки сервера, вы можете не захотеть отправить аутентификацию как кодированные данные JSON. Есть заголовки проверки подлинности по какой-либо причине, и запросы имеют обработчики проверки подлинности по какой-либо причине. 😉

  • Вы не должны указывать заголовок Content-Length самостоятельно. запросы сделают это за вас. Помимо этого, вы указываете его неправильно (в соответствии с тем, что вы разместили), поэтому 404 может быть получен из заголовка, который ваш сервер не распознает.

Теперь не должно быть причин указывать verify=False , и вы можете указать либо cert=pem_file либо verify=pem_file . Любой или оба должны быть в порядке, но вы никогда не должны использовать verify=False .

Наконец, SSLError который поднят, говорит вам, что предоставленный pem файл pem не соответствует тому, что указывает сервер. Имея это в виду, вы можете проверить настройки локального сервера. Запросы не обрабатывают сам сертификат, но urllib3 предоставляет это. Мы просто настроили его на основе параметров, которые вы предоставляете. И я сомневаюсь, что это ошибка urllib3, поскольку он вызывает SSLError который возникает из модуля ssl стандартной библиотеки.

редактировать

Объяснение в документации, *.pem файл *.pem с cert является недопустимым. Для правильной работы вы должны использовать verify='/path/to/file.pem' .

Редактировать # 2

Чтобы проверить уже отправленный запрос, вы можете сделать следующее:

 r = requests.post(...) r.request # PreparedRequest('POST', url, ...) r.request.body r.request.headers # etc. 

Чтобы изменить запрос перед отправкой, вы можете сделать следующее:

 from requests import Request, Session s = Session() r = Request('POST', url, datajson_data, headers=headers) p = r.prepare() p.body = 'New body' p.headers = #etc. s.send(p, verify=pem_file) 
Python - лучший язык программирования в мире.