El problema

He estado tratando de usar Python peticiones del paquete para descargar de la siguiente URL:

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

En Chrome, el certificado parece válida:

¿Por qué Python solicitudes de omitir el parámetro compruebe?

Sin embargo, en Python, la solicitud falla con SSLV3_ALERT_HANDSHAKE_FAILURE, incluso cuando con el verificar bandera que ignora errónea certificados:

Las solicitudes también pueden omitir verificar el certificado SSL si establece verificar False

Seguimiento de la pila

>>> 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 "<stdin>", line 1, in <module>
  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)

Entorno

OS Y paquetes

Estoy usando las solicitudes de 2.7.0 y Python 2.7.10 en un entorno virtual en OSX.

cURL

cURL llamada a la misma URL en la misma máquina funciona bien:

 $ 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=/
  • Tenga en cuenta que verify=False ignora los certificados no válidos. Esto no es un inválido cert problema, este es un apretón de manos fracaso, la verificación podrá ya han pasado.
  • A la derecha! Echaba de menos eso. Alguna idea de por qué falla?
  • Una vaga sugerencia: he tenido un problema similar hace tiempo: trate de usar un determinado ssl_version (intente con varias versiones): docs.python-requests.org/en/latest/user/advanced/…
  • Gracias. Creo que voy a tratar simplemente de otro paquete.
InformationsquelleAutor Adam Matan | 2015-09-18

3 Comentarios

  1. 18

    Validación de certificado de no fallar, por lo que el verify argumento no se aplica aquí. Lo que ha fallado es el sistema de cifrado de negociación; ninguno de los sistemas de cifrado requests está dispuesto a utilizar coincidir con los que el servidor está dispuesto a utilizar.

    Si ejecuta su curl comando con el -v interruptor verás qué suite de cifrado fue negociado por curl para el éxito de la conexión:

    $ 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
    [ .... ]

    Que la RC4-SHA de cifrado, que ha algunos de los más problemáticos securty problemas y realmente no debería ser utilizado; no ofrece confidencialidad directa por ejemplo. El urllib3 paquete (incluido con requests) por defecto excluye que de cifrado predeterminada de sistemas de cifrado. Usted puede agregar de nuevo con:

    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
    

    y su solicitud de obras:

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

    Yo no instale el pyOpenSSL paquete así que no me molesté con el try..except vigilado parte.

    • Por extraño que parezca, funciona en Ubuntu, no en OSX – alguna idea de por qué?
    • He probado esto en OSX, pero con un Python construido a partir de la fuente y con homebrew manejo de la biblioteca OpenSSL para mí. Hay dos bibliotecas SSL envuelto en requests.packages.urllib3, cada uno con su propia copia de la cadena, he añadido el pyopenssl versión del paquete demasiado.
    • Genial, gracias!
  2. 6

    Me encuentro con este, así como en macOS Sierra, Python 2.7.9 y es fijado por:

    sudo pip install –ignore-instalado pyOpenSSL –upgrade

    Es probablemente debido a la pyOpenSSL es demasiado viejo.

  3. 0

    Combinación de OpenSSL actualización y la instalación de ndg-httpsclient resuelto para mí

    sudo pip install ndg-httpsclient

    y

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

Dejar respuesta

Please enter your comment!
Please enter your name here