prawn-cake / vk-requests

vk.com requests for humans. API library for vk.com
MIT License
158 stars 22 forks source link

[question] [SSL: CERTIFICATE_VERIFY_FAILED] #30

Closed korotkiysergey closed 6 years ago

korotkiysergey commented 6 years ago

Добрый день. Возникла проблема [SSL: CERTIFICATE_VERIFY_FAILED]

Traceback (most recent call last):
  File "P:\Users\UserName\AppData\Local\Programs\Python\Python36-32\lib\site-packages\urllib3\connectionpool.py", line 601, in urlopen
    chunked=chunked)
  File "P:\Users\UserName\AppData\Local\Programs\Python\Python36-32\lib\site-packages\urllib3\connectionpool.py", line 346, in _make_request
    self._validate_conn(conn)
  File "P:\Users\UserName\AppData\Local\Programs\Python\Python36-32\lib\site-packages\urllib3\connectionpool.py", line 850, in _validate_conn
    conn.connect()
  File "P:\Users\UserName\AppData\Local\Programs\Python\Python36-32\lib\site-packages\urllib3\connection.py", line 326, in connect
    ssl_context=context)
  File "P:\Users\UserName\AppData\Local\Programs\Python\Python36-32\lib\site-packages\urllib3\util\ssl_.py", line 329, in ssl_wrap_socket
    return context.wrap_socket(sock, server_hostname=server_hostname)
  File "P:\Users\UserName\AppData\Local\Programs\Python\Python36-32\lib\ssl.py", line 407, in wrap_socket
    _context=self, _session=session)
  File "P:\Users\UserName\AppData\Local\Programs\Python\Python36-32\lib\ssl.py", line 814, in __init__
    self.do_handshake()
  File "P:\Users\UserName\AppData\Local\Programs\Python\Python36-32\lib\ssl.py", line 1068, in do_handshake
    self._sslobj.do_handshake()
  File "P:\Users\UserName\AppData\Local\Programs\Python\Python36-32\lib\ssl.py", line 689, in do_handshake
    self._sslobj.do_handshake()
ssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:777)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "P:\Users\UserName\AppData\Local\Programs\Python\Python36-32\lib\site-packages\requests\adapters.py", line 440, in send
    timeout=timeout
  File "P:\Users\UserName\AppData\Local\Programs\Python\Python36-32\lib\site-packages\urllib3\connectionpool.py", line 639, in urlopen
    _stacktrace=sys.exc_info()[2])
  File "P:\Users\UserName\AppData\Local\Programs\Python\Python36-32\lib\site-packages\urllib3\util\retry.py", line 388, in increment
    raise MaxRetryError(_pool, url, error or ResponseError(cause))
urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='api.vk.com', port=443): Max retries exceeded with url: /method/docs.search (Caused by SSLError(SSLError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:777)'),))

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\PythonProjects\statgrad\statgrad.scrapper.py", line 254, in <module>
    main()
  File "C:\PythonProjects\statgrad\statgrad.scrapper.py", line 239, in main
    downloaded = vkFindDoc (row[task].value, subjectfolder)
  File "C:\PythonProjects\statgrad\statgrad.scrapper.py", line 94, in vkFindDoc
    result = api.docs.search(q=SearchString, offset = 0, count = 1000, search_own = 0)
  File "P:\Users\UserName\AppData\Local\Programs\Python\Python36-32\lib\site-packages\vk_requests\api.py", line 64, in __call__
    return self._session.make_request(request_obj=self)
  File "P:\Users\UserName\AppData\Local\Programs\Python\Python36-32\lib\site-packages\vk_requests\session.py", line 324, in make_request
    captcha_response=captcha_response)
  File "P:\Users\UserName\AppData\Local\Programs\Python\Python36-32\lib\site-packages\vk_requests\session.py", line 385, in send_api_request
    response = self.http_session.post(**http_params)
  File "P:\Users\UserName\AppData\Local\Programs\Python\Python36-32\lib\site-packages\requests\sessions.py", line 555, in post
    return self.request('POST', url, data=data, json=json, **kwargs)
  File "P:\Users\UserName\AppData\Local\Programs\Python\Python36-32\lib\site-packages\vk_requests\utils.py", line 143, in request
    method, url, **kwargs)
  File "P:\Users\UserName\AppData\Local\Programs\Python\Python36-32\lib\site-packages\requests\sessions.py", line 508, in request
    resp = self.send(prep, **send_kwargs)
  File "P:\Users\UserName\AppData\Local\Programs\Python\Python36-32\lib\site-packages\requests\sessions.py", line 618, in send
    r = adapter.send(request, **kwargs)
  File "P:\Users\UserName\AppData\Local\Programs\Python\Python36-32\lib\site-packages\requests\adapters.py", line 506, in send
    raise SSLError(e, request=request)
requests.exceptions.SSLError: HTTPSConnectionPool(host='api.vk.com', port=443): Max retries exceeded with url: /method/docs.search (Caused by SSLError(SSLError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:777)'),))
prawn-cake commented 6 years ago

@korotkiysergey Как видно проблема на уровне ssl модуля python. По каким-то причинам сертификат не является доверенным. У себя проблема не воспроизводится. Проверьте, что у вас стоит последняя версия python-certifi

korotkiysergey commented 6 years ago

@prawn-cake Максим, спасибо за ответ. certify при обнаружении этой проблемы проверил первым делом. проблема действительно на уровне ssl модуля python. видимо что-то (непонятно что) на машине подменяет ssl сертификат. Я грешил на антивирус, но нет не антивирус :(( Воспроизводится стало с середины декабря, и насколько я понял проблема не у меня одного: например: https://ru.stackoverflow.com/questions/762774/vk-api-requests-exceptions-sslerror-%D0%B8-python Все это легко лечится добавлением verify = False в request: 142 строка в utils.py response = super(VerboseHTTPSession, self).request( method, url, **kwargs, verify=False) Можно ли этот "костыль" пробросить наверх, чтобы его можно было бы необязательным параметром дернуть из api.docs.search(q=SearchString, offset = 0, count = 1000, search_own = 0) например так api.docs.search(q=SearchString, offset = 0, count = 1000, search_own = 0, verify=False)

prawn-cake commented 6 years ago

@korotkiysergey Это хорошая идея отдать некоторый контроль за доп HTTP параметрами юзеру. И такая функциональность даже есть в API instance-e -> http_params. Это то, что передается в requests.

Здорово, что ты это заметил, т.к функция create_api не дает возможно переопределить это.

Было бы тебе интересно пофиксить это? Фикс выглядит простым, но супер полезным

prawn-cake commented 6 years ago

Fixed in 1.1.1, see README for more info.