К основному контенту

Проблемы с SSL при использовании VK API

При реализации одного из проектов, связанных с API VK я столкнулся с одной крайне интересной проблемой. У меня просто перестал работать скрипт, при этом выдавая следующую ошибку:

Traceback (most recent call last):
  File "C:\Users\Oleg\AppData\Local\Programs\Python\Python36-32\lib\site-packages\urllib3\contrib\pyopenssl.py", line 441, in wrap_socket
    cnx.do_handshake()
  File "C:\Users\Oleg\AppData\Local\Programs\Python\Python36-32\lib\site-packages\OpenSSL\SSL.py", line 1806, in do_handshake
    self._raise_ssl_error(self._ssl, result)
  File "C:\Users\Oleg\AppData\Local\Programs\Python\Python36-32\lib\site-packages\OpenSSL\SSL.py", line 1546, in _raise_ssl_error
    _raise_current_error()
  File "C:\Users\Oleg\AppData\Local\Programs\Python\Python36-32\lib\site-packages\OpenSSL\_util.py", line 54, in exception_from_error_queue
    raise exception_type(errors)
OpenSSL.SSL.Error: [('SSL routines', 'tls_process_server_certificate', 'certificate verify failed')]
 
During handling of the above exception, another exception occurred:
 
Traceback (most recent call last):
  File "C:\Users\Oleg\AppData\Local\Programs\Python\Python36-32\lib\site-packages\urllib3\connectionpool.py", line 601, in urlopen
    chunked=chunked)
  File "C:\Users\Oleg\AppData\Local\Programs\Python\Python36-32\lib\site-packages\urllib3\connectionpool.py", line 346, in _make_request
    self._validate_conn(conn)
  File "C:\Users\Oleg\AppData\Local\Programs\Python\Python36-32\lib\site-packages\urllib3\connectionpool.py", line 850, in _validate_conn
    conn.connect()
  File "C:\Users\Oleg\AppData\Local\Programs\Python\Python36-32\lib\site-packages\urllib3\connection.py", line 326, in connect
    ssl_context=context)
  File "C:\Users\Oleg\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 "C:\Users\Oleg\AppData\Local\Programs\Python\Python36-32\lib\site-packages\urllib3\contrib\pyopenssl.py", line 448, in wrap_socket
    raise ssl.SSLError('bad handshake: %r' % e)
ssl.SSLError: ("bad handshake: Error([('SSL routines', 'tls_process_server_certificate', 'certificate verify failed')],)",)
 
During handling of the above exception, another exception occurred:
 
Traceback (most recent call last):
  File "C:\Users\Oleg\AppData\Local\Programs\Python\Python36-32\lib\site-packages\requests\adapters.py", line 440, in send
    timeout=timeout
  File "C:\Users\Oleg\AppData\Local\Programs\Python\Python36-32\lib\site-packages\urllib3\connectionpool.py", line 639, in urlopen
    _stacktrace=sys.exc_info()[2])
  File "C:\Users\Oleg\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='m.vk.com', port=443): Max retries exceeded with url: / (Caused by SSLError(SSLError("bad handshake: Error([('SSL routines', 'tls_process_server_certificate', 'certificate verify failed')],)",),))
 
During handling of the above exception, another exception occurred:
 
Traceback (most recent call last):
  File "E:\work\python\vk\parse_group.py", line 5, in <module>
    session = vk.AuthSession(app_id='***', user_login='***', user_password='***')
  File "C:\Users\Oleg\AppData\Local\Programs\Python\Python36-32\lib\site-packages\vk\mixins.py", line 32, in __init__
    self.access_token = self.get_access_token()
  File "C:\Users\Oleg\AppData\Local\Programs\Python\Python36-32\lib\site-packages\vk\mixins.py", line 69, in get_access_token
    self.login()
  File "C:\Users\Oleg\AppData\Local\Programs\Python\Python36-32\lib\site-packages\vk\mixins.py", line 82, in login
    response = self.auth_session.get(self.LOGIN_URL)
  File "C:\Users\Oleg\AppData\Local\Programs\Python\Python36-32\lib\site-packages\requests\sessions.py", line 521, in get
    return self.request('GET', url, **kwargs)
  File "C:\Users\Oleg\AppData\Local\Programs\Python\Python36-32\lib\site-packages\vk\utils.py", line 78, in request
    response = super(LoggingSession, self).request(method, url, **kwargs)
  File "C:\Users\Oleg\AppData\Local\Programs\Python\Python36-32\lib\site-packages\requests\sessions.py", line 508, in request
    resp = self.send(prep, **send_kwargs)
  File "C:\Users\Oleg\AppData\Local\Programs\Python\Python36-32\lib\site-packages\requests\sessions.py", line 618, in send
    r = adapter.send(request, **kwargs)
  File "C:\Users\Oleg\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='m.vk.com', port=443): Max retries exceeded with url: / (Caused by SSLError(SSLError("bad handshake: Error([('SSL routines', 'tls_process_server_certificate', 'certificate verify failed')],)",),))
 
 
Странность состояла в том, что на двух виндовых машинах данный скрипт не запускался, а на unix машине все работало без проблем. Искал долго решение проблемы, но ни к чему это не привело. Как итог я сделал следующий костыль:

Отключил проверку сертификата в файле utils.py (Lib\site-packages\vk)

# Строка 78
response = super(LoggingSession, self).request(method, url, **kwargs, verify=False)


После этого все заработало, но начали появляться предупреждения типа

C:\Users\Oleg\AppData\Local\Programs\Python\Python36-32\lib\site-packages\urllib3\connectionpool.py:858: InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings
Которые убрались внедрением следующего кода:

import urllib3
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

Я понимаю, что это достаточно кривой способ решения проблемы, но пока я даже причины не нашел, поэтому приходится довольствоваться подобными “костылями”.

Комментарии

  1. Отключил бы антивирус, который подменяет сертификат (Касперский), и все было бы ок.

    ОтветитьУдалить

Отправить комментарий

Популярные сообщения из этого блога

Почему нельзя наследовать структуры в C# ?

Введение - зачем используются структуры? Все мы сильно любим структуры (идея, чуждая Java, не считая примитивных типов). Структуры, когда они не упакованы, зачастую, предоставляют прекрасную возможность обрабатывать динамические данные относительно небольшого размера. Размещение и освобождение типов данных в целом проще, чем размещение и освобождение ссылочных типов. Это связано тем, что структуры размещаются в стеке, либо встроены в содержащиеся типы и освобождаются, при очищении стека либо когда встроенные типы перераспределяются, в то время, как ссылочные типы размещаются в куче и очищаются сборщиком мусора (garbage-collected) Хм... Структуры не хотят наследоваться. Объектно-Ориентированное Программирование дает нам возможность делать много полезных вещей. И основной коцепт - это, конечно же, наследование. Многие из нас, когда либо, пытались наследовать структуру только для того, что бы понять, что C# не позволит нам этого сделать. Для примера рассмотрим код: /

Использование curl в C#

Для того что бы скачать страницу какого-либо сайта в основном используют код следующего вида: string page ; using ( var client = new WebClient ( ) ) { page = client . DownloadString ( "http://www.example.com/" ) ; } Конечно, это простейший код, но в большинстве случаев он работает. Но бывают случаи, когда при "парсинге" возникает ошибка:   500 Internal Server Error .  В основном, она возникает в случае, если сервер не может получить от нас h t tp-заголовок при запросе данных. (Конечно, это может быть и ошибка на сервере, но мы будет обсуждать случай, когда сайт защищен подобным способом) В данном случае нам необходимо отправлять http-заголовок на сервер, таким образом мы маскируемся под браузер. Для этого и служит библиотека curl. Программа cURL может автоматизировать передачу файлов или последовательность таких операций. Например, это хорошее средство для моделирования действий пользователя в веб-обозревателе. ( wikipedia ) Для исп