2015-05-26 17 views
5

XMLRPC API'sine yerel bir HTTPS bağlantısı kurmaya çalışıyorum. Benim API kullandığımda enable by default certificates verification, ben CERTIFICATE_VERIFY_FAILED hata var piton 2.7.9 yükseltme beripython'da varsayılan sertifika doğrulamayı devre dışı bırakma 2.7.9

>>> 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)}] 

mu piton 2.7.9 varsayılan sertifika doğrulamasını devre dışı bırakmasına pythonic yol var?

o "özel" küresel SSL özelliğini değiştirmek için iyiyse ben gerçekten bilmiyorum (ssl._create_default_https_context = ssl._create_unverified_context)

cevap

16

Sen doğrulanmamış bir SSL içeriği, el ile inşa veya SSL gelen özel fonksiyon _create_unverified_context() kullanarak sağlamak zorunda modül:

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() 

Not: Bu kod yalnızca piton ile çalışır> = 2.7.9 (context parametre Python 2.7.9 eklendi)

önceki Pyth ile uyumlu bir koda sahip olmak istiyorsanız Örneğin Python 2.6.6 ile

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

En azından Pytho için n 2.7.6 ikinci çözüm, 'ssl' dos' _create_unverified_context() 'fonksiyonuna sahip olmadığı ve kaynak kodunda görebildiğim gibi, Python 2.7.8'in de çalışmadığı gibi çalışmaz. – Adaephon

+0

Evet, siz doğruyunuz @Adaephon, ancak bu satırı yazdığımda eski Python sürümü ile test etme şansım olmadı. Uyumluluğun üstesinden gelmenin ve özel işlevi kullanmamanın doğru yolunun, _unverified_ içeriğimizi el ile yapmak olduğunu düşünüyorum. Daha basit bir çözüm, bu işlevin varlığını test etmektir. –

-1

: versiyonunda, sen transport parametresini kullanmak zorunda

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

Bana uyar ...

1

O kullanarak doğrulamayı devre dışı bırakmak mümkün Python 2.7.9+ üzerinde bulunan herkese açık ssl API'ları mevcut:

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() 
İlgili konular