2016-03-16 32 views
7

Ben aşağıda bir kod vardır:SSL Bağlam

headers = {'content-type': 'ContentType.APPLICATION_XML'} 
uri = "www.client.url.com/hit-here/" 
clientCert = "path/to/cert/abc.crt" 
clientKey = "path/to/key/abc.key" 
PROTOCOL = ssl.PROTOCOL_TLSv1 
context = ssl.SSLContext(PROTOCOL) 
context.load_default_certs() 
context.load_cert_chain(clientCert, clientKey) 
conn = httplib.HTTPSConnection(uri, some_port, context=context) 

Gerçekten bir ağ programcı değilim, bu yüzden bazı el sıkışma bağlantısı için googling yaptı ve gerekli fonksiyonu olarak ssl.SSLContext(PROTOCOL) bulundu, kod çalışıyor .

Daha sonra roadblock'a bastım, yerel sürümüm 2.7.10'du, ancak tüm üretim kutularının 2.7.3'ü var, bu nedenle SSLContext desteklenmiyor ve yükseltme python sürümü bir seçenek/denetimde değil.

ssl — SSL wrapper for socket objects okumayı denedim ama bundan bir anlam çıkaramıyordum.

(nafile içinde ) denedim neyi

:

s_ = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s = ssl.wrap_socket(s_, keyfile=clientKey, certfile=clientCert, cert_reqs=ssl.CERT_REQUIRED) 
new_conn = s.connect((uri, some_port)) 

ama döner:

SSLError(1, u'[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:590)') 

Soru - Güvenli https sahip olacak şekilde eski sürümü SSL Bağlam nasıl oluşturulacağını bağ?

+1

Eski sürümün bir bağlam ile çalışabileceğini sanmıyorum. Eğer sertifika belirtmeden https bağlantısı, yani bağl = httplib.HTTPSConnection (host, port KEY_FILE, cert_file, sıkı, zaman aşımı) yapabilir misin ayrıntılı biraz daha –

cevap

0

Sen

+0

oluşturarak denediniz mi? – NoobEditor

+0

Sunucu sertifikasına güvenmek için sunucu sertifikasyonuna sahip olmanız gerekir. Yani wrap_socket ssl.wrap_socket gibi olmalıdır (s_, keyfile = clientKey, certfile = clientCert, ca_certs = cacertfile cert_reqs = ssl.CERT_REQUIRED) –

0

Ben requests library kullanarak mükemmel bir çözüm var (mağaza güven işaret etmelidir) ca_certs dosyayı belirtmek gerekir. İstek kütüphanesi, şimdiye kadar kullandığım en sevdiğim kitaplık olmalıydı, bu yüzden Python'da yapmanın zor olduğu bir şey var - SSL ve REST istekleri - ve bunu inanılmaz derecede basit hale getiriyor. Onların sürüm desteğini kontrol ettim ve Python 2.6+ destekleniyor.

Kitaplıklarının nasıl kullanılacağına dair bir örnek.

>>> requests.get(uri) 

Ve yapmanız gereken tek şey budur. İstek kütüphanesi bir ssl bağlantısı kurmaya özen gösterir.


Bunu bir adım daha ileriye almak. İstekler arasında çerezleri sürdürmeniz gerekiyorsa, bunu yapabilirsiniz.

>>> sess = requests.Session() 
>>> credentials = {"username": "user", 
        "password": "pass"} 
>>> sess.post("https://some-website/login", params=credentials) 
<Response [200]> 
>>> sess.get("https://some-website/a-backend-page").text 
<html> the backend page... </html> 

Düzenleme: Eğer gerekiyorsa da yapabilirsiniz pass in the path to the certificate and the key


Şimdi

it would neden umarım, üretim kutularında istekleri kütüphane kurmak için ikna edebilirim requests.get(uri, cert=('path/to/cert/abc.crt', 'path/to/key/abc.key')) şöyle buna değer ol. Bunun sizin için uygun olup olmadığını bana bildirin.

+0

şifreli anahtarlar ve request.post dokümanlar herhangi sertifika yok desteklemez request.get/anahtar belgeler ... herhangi düşünceler dostum? – NoobEditor

+0

Dang it.Bunu yapmanın başka yollarını düşünemiyorum, ama eğer yaparsam, size bildireceğim. –