Почему запросы Python игнорируют параметр проверки?

Проблема

Я пытаюсь использовать пакет запросов Python для загрузки следующего URL-адреса:

https://service.isracard.co.il/I_logon.jsp

В Chrome сертификат действителен:

введите описание изображения здесь

Однако в Python запрос не работает с SSLV3_ALERT_HANDSHAKE_FAILURE , даже если используется флаг verify который игнорирует ошибочные сертификаты:

Запросы также могут игнорировать проверку SSL-сертификата, если вы установите флажок False

Трассировки стека

 >>> requests.__version__ '2.7.0' >>> LOGIN_URL = 'https://service.isracard.co.il/I_logon.jsp' >>> requests.get(LOGIN_URL, verify=False) Traceback (most recent call last): File "", line 1, in  File "/private/tmp/sslenv/lib/python2.7/site-packages/requests/api.py", line 69, in get return request('get', url, params=params, **kwargs) File "/private/tmp/sslenv/lib/python2.7/site-packages/requests/api.py", line 50, in request response = session.request(method=method, url=url, **kwargs) File "/private/tmp/sslenv/lib/python2.7/site-packages/requests/sessions.py", line 465, in request resp = self.send(prep, **send_kwargs) File "/private/tmp/sslenv/lib/python2.7/site-packages/requests/sessions.py", line 573, in send r = adapter.send(request, **kwargs) File "/private/tmp/sslenv/lib/python2.7/site-packages/requests/adapters.py", line 431, in send raise SSLError(e, request=request) requests.exceptions.SSLError: [SSL: SSLV3_ALERT_HANDSHAKE_FAILURE] sslv3 alert handshake failure (_ssl.c:590) 

Окружающая среда

ОС и пакеты

Я использую запросы 2.7.0 и Python 2.7.10 в виртуальной среде на OSX.

завивать

вызов cURL на тот же URL-адрес на одном и том же компьютере отлично работает:

  $ curl -I https://service.isracard.co.il/I_logon.jsp HTTP/1.1 200 OK Date: Fri, 18 Sep 2015 11:37:27 GMT Server: IBM_HTTP_Server X-Powered-By: Servlet/3.0 Set-Cookie: JSESSIONID=0000R90MxFKBVxBMV665syGfjnh:-1; Path=/; HttpOnly Expires: Thu, 01 Dec 1994 16:00:00 GMT Cache-Control: no-cache="set-cookie, set-cookie2" Set-Cookie: Alt50_ZLinuxPrd=94742720.30755.0000; expires=Fri, 18-Sep-2015 12:07:19 GMT; path=/ Content-Type: text/html; charset=ISO-8859-8 Content-Language: iw-IL Set-Cookie: ServiceP=53323968.20480.0000; path=/ 

Проверка сертификата не прерывалась, поэтому аргумент verify здесь не применяется. Не удалось выполнить согласование шифрования; ни один из requests шифров не желает использовать совпадение с тем, которое сервер хочет использовать.

Если вы запустите команду curl с помощью переключателя -v вы увидите, какой набор шифров был согласован curl для успешного соединения:

 $ curl -v -I https://service.isracard.co.il/I_logon.jsp * Hostname was NOT found in DNS cache * Trying 192.118.12.8... * Connected to service.isracard.co.il (192.118.12.8) port 443 (#0) * TLS 1.2 connection using TLS_RSA_WITH_RC4_128_SHA [ .... ] 

Это шифр RC4-SHA, который имеет некоторые довольно неприятные проблемы с безопасностью и не должен использоваться на самом деле; Например, он не предлагает прямую секретность . Пакет urllib3 (в комплекте с requests ) по умолчанию исключает этот шифр из шифров по умолчанию. Вы можете добавить его обратно:

 import requests requests.packages.urllib3.util.ssl_.DEFAULT_CIPHERS += ':RC4-SHA' try: requests.packages.urllib3.contrib.pyopenssl.DEFAULT_SSL_CIPHER_LIST += ':RC4-SHA' except AttributeError: # no pyopenssl support used / needed / available pass 

и ваш запрос работает:

 >>> import requests >>> requests.packages.urllib3.util.ssl_.DEFAULT_CIPHERS += ':RC4-SHA' >>> requests.get('https://service.isracard.co.il/I_logon.jsp')  

Я не устанавливал пакет pyOpenSSL, поэтому я не беспокоился о try..except защищенной части.

Я столкнулся с этим также и с macOS Sierra, Python 2.7.9, и он исправлен:

sudo pip install – установленная установка pyOpenSSL –upgrade

Вероятно, из-за того, что pyOpenSSL слишком стар.

Комбинация обновления OpenSSL и установка ndg-httpsclient разрешили это для меня

sudo pip install ndg-httpsclient

а также

sudo pip install --ignore-installed pyOpenSSL --upgrade

  • проверка сертификата сервера не удалась. CAfile: /etc/ssl/certs/ca-certificates.crt CRLfile: none
  • Ошибка: невозможно проверить первый сертификат в nodejs
  • Установка SSL на сервере Wamp: ошибка в httpd-ssl.conf
  • Отключить предупреждение безопасности для сайтов Intranet
  • Использование SSL и SslStream для одноранговой аутентификации?
  • Trust Anchor не найден для подключения SSL для Android
  • Постоянное получение ошибок сертификата https во всех браузерах
  • Вызывается: java.security.UnrecoverableKeyException: невозможно восстановить ключ
  • Избегайте ввода пароля для ключей и подсказок для информации о DN
  • Ошибка SSL: certificate_verify_failed при очистке https://www.thenewboston.com/
  • Возможно ли преобразовать SSL-сертификат из файла .key в .pfx?
  • Interesting Posts

    Как я могу использовать квоты в самбе?

    Являются ли массивы C # streamами безопасными?

    Каково значение по умолчанию для членов classа C ++

    jQuery ведет себя странно после обновления страницы (F5) в Chrome

    В чем разница между персонажем, точкой кода, глифом и графемой?

    Есть ли удаленный рабочий стол инструмент управления, который я могу отправлять по электронной почте людям?

    Asp.Net MVC3: установка пользовательского IServiceProvider в ValidationContext, поэтому валидаторы могут разрешать услуги

    OpenSSL отсутствует во время ./configure. Как исправить?

    Firebase: различия между базой данных в реальном времени и хранением файлов

    `pg_tblspc` отсутствует после установки последней версии OS X (Yosemite или El Capitan)

    Как развернуть приложение на базе EJB на Tomcat

    Как мне управлять зависимостями между проектами в рабочей области Xcode?

    Регулярное выражение для повторения любого символа более 10 раз

    Как отключить Aero Shake в Windows 7?

    Excel: невероятное сокращение и расширение элементов управления

    Давайте будем гением компьютера.