2015-05-26 7 views
5

Ich versuche, eine lokale HTTPS-Verbindung zu einem XMLRPC API. Da ich zu Python Upgrade 2.7.9, die enable by default certificates verification, bekam ich einen CERTIFICATE_VERIFY_FAILED Fehler, wenn ich meinedeaktivieren Standard-Zertifikat-Überprüfung in Python 2.7.9

API verwenden
>>> test=xmlrpclib.ServerProxy('https://admin:[email protected]:9999/API',verbose=False, use_datetime=True) 
>>> test.list_satellites() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/local/lib/python2.7/xmlrpclib.py", line 1233, in __call__ 
    return self.__send(self.__name, args) 
    File "/usr/local/lib/python2.7/xmlrpclib.py", line 1591, in __request 
    verbose=self.__verbose 
    File "/usr/local/lib/python2.7/xmlrpclib.py", line 1273, in request 
    return self.single_request(host, handler, request_body, verbose) 
    File "/usr/local/lib/python2.7/xmlrpclib.py", line 1301, in single_request 
    self.send_content(h, request_body) 
    File "/usr/local/lib/python2.7/xmlrpclib.py", line 1448, in send_content 
    connection.endheaders(request_body) 
    File "/usr/local/lib/python2.7/httplib.py", line 997, in endheaders 
    self._send_output(message_body) 
    File "/usr/local/lib/python2.7/httplib.py", line 850, in _send_output 
    self.send(msg) 
    File "/usr/local/lib/python2.7/httplib.py", line 812, in send 
    self.connect() 
    File "/usr/local/lib/python2.7/httplib.py", line 1212, in connect 
    server_hostname=server_hostname) 
    File "/usr/local/lib/python2.7/ssl.py", line 350, in wrap_socket 
    _context=self) 
    File "/usr/local/lib/python2.7/ssl.py", line 566, in __init__ 
    self.do_handshake() 
    File "/usr/local/lib/python2.7/ssl.py", line 788, in do_handshake 
    self._sslobj.do_handshake() 
ssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:581) 
>>> import ssl 
>>> ssl._create_default_https_context = ssl._create_unverified_context 
>>> test.list_satellites() 
[{'paired': True, 'serial': '...', 'enabled': True, 'id': 1, 'date_paired': datetime.datetime(2015, 5, 26, 16, 17, 6)}] 

Does eine pythonic Weg existiert 2.7.9 Standardzertifikatsüberprüfung in Python zu deaktivieren?

ich nicht wirklich wissen, ob es gut ist „privates“ globales SSL-Attribut zu ändern (ssl._create_default_https_context = ssl._create_unverified_context)

Antwort

16

Sie haben einen nicht verifizierten SSL Kontext, von Hand gebaut oder die private Funktion _create_unverified_context mit() von ssl Modul:

import xmlrpclib 
import ssl 

test = xmlrpclib.ServerProxy('https://admin:[email protected]:9999/API', 
          verbose=False, use_datetime=True, 
          context=ssl._create_unverified_context()) 
test.list_satellites() 

Hinweis: dieser Code funktioniert nur mit Python> = 2.7.9 (context Parameter wurden in Python 2.7.9 hinzugefügt)

Wenn Sie einen Code kompatibel mit früheren Pyth haben wollen auf Version, müssen Sie die transport Parameter verwenden:

import xmlrpclib 
import ssl 

context = hasattr(ssl, '_create_unverified_context') and ssl._create_unverified_context() \ 
      or None 
test = xmlrpclib.ServerProxy('https://admin:[email protected]:9999/API', 
          verbose=False, use_datetime=True, 
          transport=xmlrpclib.SafeTransport(use_datetime=True, 
                   context=context)) 
test.list_satellites() 
+2

Zumindest für Pytho n 2.7.6 die zweite Lösung funktioniert auch nicht, da 'ssl' nicht die Funktion' _create_unverified_context() 'hat und aus dem, was ich im Quelltext sehen kann, auch Python 2.7.8 nicht. – Adaephon

+0

Ja, du bist wahr @Adaephon, aber ich hatte nicht die Möglichkeit, mit älteren Python-Version zu testen, wenn ich diese Zeile schrieb. Ich denke, der richtige Weg, die Kompatibilität zu handhaben und private Funktionen nicht zu verwenden, besteht darin, unseren Kontext _unified_ von Hand zu erstellen. Einfachere Lösung ist das Testen der Existenz dieser Funktion. –

-1

Mit Python 2.6.6 zum Beispiel:

s = xmlrpclib.ServerProxy('https://admin:[email protected]:9999/API', transport=None, encoding=None, verbose=0,allow_none=0, use_datetime=0) 

Es funktioniert für mich ...

1

Es ist möglich, Überprüfung zu deaktivieren Verwendung die öffentlichen ssl APIs auf Python 2.7.9 +:

import xmlrpclib 
import ssl 

ssl_ctx = ssl.create_default_context() 
ssl_ctx.check_hostname = False 
ssl_ctx.verify_mode = ssl.CERT_NONE 
test = xmlrpclib.ServerProxy('https://admin:[email protected]:9999/API', 
          verbose=False, use_datetime=True, 
          context=ssl_ctx) 
test.list_satellites() 
Verwandte Themen