HTTPS-запрос Python SSLError CERTIFICATE_VERIFY_FAILED - PullRequest
0 голосов
/ 22 октября 2018

PYTHON

import requests

url = "https://REDACTED/pb/s/api/auth/login"

r = requests.post(
    url,
    data = {
        'username': 'username',
        'password': 'password'
    }
)

NIM

import httpclient, json

let client = newHttpClient()

client.headers = newHttpHeaders({ "Content-Type": "application/json" })
let body = %*{
    "username": "username",
    "password": "password"
}

let resp = client.request("https://REDACTED.com/pb/s/api/auth/login", httpMethod = httpPOST, body = $body)

echo resp.body

Я вызываю API для получения некоторых данных.Запустив код Python я получаю трассировку ниже.Тем не менее, код NIM работает отлично, поэтому должно быть что-то не так с кодом Python или установки

Я использую Python версии 2.7.15.запрашивает версию lib 2.19.1

Traceback (most recent call last):
  File "C:/Python27/testht.py", line 21, in <module>
    "Referer": "https://REDACTED.com/pb/a/"
  File "C:\Python27\lib\site-packages\requests\api.py", line 112, in post
    return request('post', url, data=data, json=json, **kwargs)
  File "C:\Python27\lib\site-packages\requests\api.py", line 58, in request
    return session.request(method=method, url=url, **kwargs)
  File "C:\Python27\lib\site-packages\requests\sessions.py", line 512, in request
    resp = self.send(prep, **send_kwargs)
  File "C:\Python27\lib\site-packages\requests\sessions.py", line 622, in send
    r = adapter.send(request, **kwargs)
  File "C:\Python27\lib\site-packages\requests\adapters.py", line 511, in send
    raise SSLError(e, request=request)
SSLError: HTTPSConnectionPool(host='REDACTED.com', port=443): Max retries exceeded with url: /pb/s/api/auth/login (Caused by SSLError(SSLError(1, u'[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:726)'),))

Ответы [ 2 ]

0 голосов
/ 22 октября 2018

Однако код nim работает отлично, поэтому с кодом или настройкой python должно быть что-то не так.

На самом деле, ваш код или настройки Python меньше виноваты, но вместо этого nim код или лучше значения по умолчанию в библиотеке httpclient.В документации для nim видно, что httpclient.request использует контекст SSL, возвращаемый getDefaultSSL по умолчанию, который согласно этот код создает контекст, который не проверяет сертификат:

proc getDefaultSSL(): SSLContext =
  result = defaultSslContext
  when defined(ssl):
    if result == nil:
      defaultSSLContext = newContext(verifyMode = CVerifyNone)

Вместо этого ваш код Python пытается правильно проверить сертификат, поскольку библиотека requests делает это по умолчанию.И он не может проверить сертификат, потому что что-то не так - либо с вашей настройкой, либо с сервером.

Неясно, кто выпустил сертификат для вашего сайта, но если его нет в вашем хранилище CA по умолчанию, вы можете использоватьverify аргумент requests для указания ЦС эмитента.См. эту документацию для подробностей.

Если сайт, к которому вы пытаетесь получить доступ, работает с браузером, но не работает с вашей программой, возможно, он использует специальный центр сертификации, который был добавлен в качестве доверенного для браузера (например, сертификат компании).Браузеры и Python используют разные хранилища доверия, поэтому этот добавленный сертификат необходимо добавить в Python или, по крайней мере, в вашу программу в качестве доверенных.Возможно также, что при настройке сервера возникли проблемы.Браузеры могут иногда обходить такие проблемы, как отсутствие промежуточного сертификата, а Python - нет.В случае общедоступного сайта вы можете использовать SSLLabs , чтобы проверить, что не так.

0 голосов
/ 22 октября 2018

Модуль requests будет проверять сертификат, который он получает от сервера, так же, как и браузер.Вместо того, чтобы кликать и говорить «добавить исключение», как в браузере, requests вызовет это исключение.

Хотя есть способ обойти это: попробуйте добавить verify=False к * 1006.* Звоните.

...