2016-06-09 8 views
0

Ich bin mit dem folgenden Fall fest: beim Aufruf eines HTTPS-Links von Python und requests, bekomme ich eine Zeitüberschreitung auf meinem Ubuntu Laptop, sowie auf Linuxes I ' Ich habe es in VirtualBox und einem anderen Laptop versucht. Derselbe Python-Code gibt jedoch eine gültige Antwort unter Windows 7, Mac OS X und dem neuesten FreeBSD-System zurück. Das Problem tauchte vor ungefähr zwei Wochen auf, und ich vermute, dass es wahrscheinlich daran lag, dass etwas auf dem Server geändert wurde, was sich nur auf den Linux-Netzwerk-Stack auswirkte. Irgendwelche Ideen, warum es tatsächlich passieren kann und wie man es beheben kann, sind willkommen.SSL-Timeout beim Aufruf einer URL über Python und Anfragen

Unten sind die Details.

  • Python-Version die ich verwendet habe: neueste, 2.7.11
  • requests Version: 2.10
  • Betriebssysteme Ich habe versucht: Ubuntu 16.04, Ubuntu 15.10, 23 Fedora, CentOS 6, Windows 7, FreeBSD, Mac OS X

Hinweis: alle wesentlichen Daten unten wurde wegen NDA übersprungen.

Der eigentliche Python-Code, der fehlschlägt:

import requests 
import logging 
import httplib as http_client 
import ssl 


http_client.HTTPConnection.debuglevel = 1 

logging.basicConfig() 
logging.getLogger().setLevel(logging.DEBUG) 
requests_log = logging.getLogger("requests.packages.urllib3") 
requests_log.setLevel(logging.DEBUG) 
requests_log.propagate = True 

url = 'https://subdomain.example1.com/products/12345' 
cert = ('example.pem', 'example.key') 
response = requests.get(url=url, 
         params={'locale': 'en_US'}, 
         headers={'Content-Type': 'application/x-www-form-urlencoded', 'Accept': 'application/json'}, 
         timeout=10.0, 
         cert=cert, 
         verify=False, 
         cookies=None) 
print response 

Ergebnis den Code oben auf Linux-Versionen ausgeführt wird:

$ python req.py 
INFO:requests.packages.urllib3.connectionpool:Starting new HTTPS connection (1): subdomain.example1.com 
Traceback (most recent call last): 
    File "req.py", line 23, in <module> 
    cookies=None) 
    File "/usr/local/lib/python2.7/dist-packages/requests/api.py", line 67, in get 
    return request('get', url, params=params, **kwargs) 
    File "/usr/local/lib/python2.7/dist-packages/requests/api.py", line 53, in request 
    return session.request(method=method, url=url, **kwargs) 
    File "/usr/local/lib/python2.7/dist-packages/requests/sessions.py", line 468, in request 
    resp = self.send(prep, **send_kwargs) 
    File "/usr/local/lib/python2.7/dist-packages/requests/sessions.py", line 576, in send 
    r = adapter.send(request, **kwargs) 
    File "/usr/local/lib/python2.7/dist-packages/requests/adapters.py", line 449, in send 
    raise ReadTimeout(e, request=request) 
requests.exceptions.ReadTimeout: HTTPSConnectionPool(host='subdomain.example1.com', port=443): Read timed out. (read timeout=10.0) 

Ergebnis des gleichen Code auf Linux mit Timeout auf 300,0:

$ python req.py 
INFO:requests.packages.urllib3.connectionpool:Starting new HTTPS connection (1): subdomain.example1.com 
Traceback (most recent call last): 
    File "req.py", line 23, in <module> 
    cookies=None) 
    File "/usr/local/lib/python2.7/dist-packages/requests/api.py", line 67, in get 
    return request('get', url, params=params, **kwargs) 
    File "/usr/local/lib/python2.7/dist-packages/requests/api.py", line 53, in request 
    return session.request(method=method, url=url, **kwargs) 
    File "/usr/local/lib/python2.7/dist-packages/requests/sessions.py", line 468, in request 
    resp = self.send(prep, **send_kwargs) 
    File "/usr/local/lib/python2.7/dist-packages/requests/sessions.py", line 576, in send 
    r = adapter.send(request, **kwargs) 
    File "/usr/local/lib/python2.7/dist-packages/requests/adapters.py", line 447, in send 
    raise SSLError(e, request=request) 
requests.exceptions.SSLError: ("bad handshake: Error([('SSL routines', 'ssl3_read_bytes', 'sslv3 alert unexpected message')],)",) 

Ein korrektes Python-Code-Run-Ergebnis aus FreeBSD:

$ python req.py 
INFO:requests.packages.urllib3.connectionpool:Starting new HTTPS connection (1): subdomain.example1.com 
/usr/local/lib/python2.7/site-packages/requests/packages/urllib3/connectionpool.py:821: InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.org/en/latest/security.html 
    InsecureRequestWarning) 
send: 'GET /products/12345?locale=en_US HTTP/1.1\r\nHost: subdomain.example1.com\r\nConnection: keep-alive\r\nAccept-Encoding: gzip, deflate\r\nAccept: application/json\r\nUser-Agent: python-requests/2.10.0\r\nContent-Type: application/x-www-form-urlencoded\r\n\r\n' 
reply: 'HTTP/1.1 200 OK\r\n' 
header: Server: Apache-Coyote/1.1 
header: Cache-Control: private 
header: Expires: Wed, 31 Dec 1969 17:00:00 MST 
header: Content-Type: application/json;charset=UTF-8 
header: Transfer-Encoding: chunked 
header: Date: Thu, 09 Jun 2016 16:13:37 GMT 
DEBUG:requests.packages.urllib3.connectionpool:"GET /products/12345?locale=en_US HTTP/1.1" 200 None 
<Response [200]> 

Ein Versuch von openssl:

$ openssl s_client -connect subdomain.example1.com:443 -cert example.pem -key example.key 
CONNECTED(00000003) 
depth=2 CN = Root.Example2.com 
verify return:1 
depth=1 DC = com, DC = example3, CN = ca-example3 
verify return:1 
depth=0 ST = Colorado, L = Boulder, O = Example4.com, OU = WebOps, CN = *.example1.com 
verify return:1 
139622025893528:error:140943F2:SSL routines:ssl3_read_bytes:sslv3 alert unexpected message:s3_pkt.c:1472:SSL alert number 10 
139622025893528:error:140790E5:SSL routines:ssl23_write:ssl handshake failure:s23_lib.c:177: 
--- 
Certificate chain 
0 s:/ST=Colorado/L=Boulder/O=Example4.com/OU=WebOps/CN=*.example1.com 
    i:/DC=com/DC=example3/CN=ca-example3 
--- 
Server certificate 
-----BEGIN CERTIFICATE----- 
........ SKIPPED .........                                                    
-----END CERTIFICATE-----                                                              
subject=/ST=Colorado/L=Boulder/O=Example4.com/OU=WebOps/CN=*.example1.com                                                   
issuer=/DC=com/DC=example3/CN=ca-example3                                                        
---                                                                    
Acceptable client certificate CA names                                                           
/O=Example4.com/OU=WebOps/CN=cl_ABCDEFGHI                                                          
/O=Example4.com/OU=WebOps/CN=cl_QWERTYUIO                                                          
/CN=Root.Example2.com 
/DC=com/DC=example3/CN=ca-example3 
/O=Example4.com/OU=WebOps/CN=cl_ASDFGHJKL 
/O=Example4.com/OU=WebOps/CN=cl_ZXCVBNabc 
/O=Example4.com/OU=WebOps/CN=cl_poiuytrew 
Client Certificate Types: RSA sign, DSA sign, ECDSA sign 
Requested Signature Algorithms: ECDSA+SHA512:RSA+SHA512:ECDSA+SHA384:RSA+SHA384:ECDSA+SHA256:RSA+SHA256:ECDSA+SHA224:RSA+SHA224:ECDSA+SHA1:RSA+SHA1:DSA+SHA1:RSA+MD5 
Shared Requested Signature Algorithms: ECDSA+SHA512:RSA+SHA512:ECDSA+SHA384:RSA+SHA384:ECDSA+SHA256:RSA+SHA256:ECDSA+SHA224:RSA+SHA224:ECDSA+SHA1:RSA+SHA1:DSA+SHA1 
Peer signing digest: SHA512 
Server Temp Key: ECDH, P-256, 256 bits 
--- 
SSL handshake has read 2573 bytes and written 4570 bytes 
--- 
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES128-GCM-SHA256 
Server public key is 2048 bit 
Secure Renegotiation IS supported 
Compression: NONE 
Expansion: NONE 
No ALPN negotiated 
SSL-Session: 
    Protocol : TLSv1.2 
    Cipher : ECDHE-RSA-AES128-GCM-SHA256 
    Session-ID: 57591435C56B9FDFXXXBB896F8140E7B72EE07A2ACDB0446F0AB04C5D2928FD1 
    Session-ID-ctx: 
    Master-Key: F830C1F0330391B5XXX3E58F07C23D7A8C2020F824C0C4389D798CCA16A6AD5D556881671001A7DD6641AC4739BE2E28 
    Key-Arg : None 
    PSK identity: None 
    PSK identity hint: None 
    SRP username: None 
    Start Time: 1465455669 
    Timeout : 300 (sec) 
    Verify return code: 0 (ok) 
--- 

Der Host gültig scheint, ich bin in der Lage, es pingen, openssl Anruf von jedem Betriebssystem, einschließlich Linux-Box zeigt es noch lebt und reagiert auf Anfragen.

Vielen Dank im Voraus.

+0

Wenn ich Sie richtig verstehe, funktioniert openssl s_client von allen Maschinen, aber python/ssl nicht? Sind Sie sicher, dass Sie Python 2.7.11 auch unter FreeBSD verwenden, da die Warnung über InsecureRequest ... einen Unterschied zur Version unter Linux vermuten lässt? Funktioniert s_client noch, wenn Sie SNI mit dem Parameter '-servername' verwenden? –

+0

openssl s_client funktioniert auf allen Maschinen korrekt, ja. Und Python/Anfragen funktioniert nur auf Nicht-Linux. –

+0

Ja, es ist Python 2.7.11 unter FreeBSD, nur überprüft. –

Antwort

0

Es scheint, dass das Problem durch Fehler in virtualbox verursacht wurde, wenn nat network über mehrere Versionen hinweg verwendet wurde. Laut this issue wurde der Fehler in Release 5.1.10 behoben. Aber ich habe das gleiche Problem in Virtual Box 5.1.12 auf einem Windows-Host.

+0

Gut zu hören, dass sie es behoben haben. Und wir sind inzwischen zu Docker gewechselt, ein weiteres Problem ist weg. Danke für's Erwähnen! –