2015-09-23 5 views
2

У меня возникла проблема с проверкой конечной точки HTTPS при предоставлении определенного пути сертификата к опции «проверка»; установка «проверяет» на истинную работу DOES:Проверка подлинности Python [SSL: CERTIFICATE_VERIFY_FAILED] (_ssl.c: 590)

import requests 

def run_tests(): 
    url="https://www.google.com" 
    certfilename="google.crt" 
    generate_cert_file(certfilename) 
    response = requests.get(url, verify=False) 
    print "URL:%s, Verify=False. Result: %s"%(url, response.status_code) 
    response = requests.get(url, verify=True) 
    print "URL:%s, Verify=True. Result: %s"%(url, response.status_code) 
    response = requests.get(url, verify=certfilename) 
    print "URL:%s, Verify=%s. Result: %s"%(url, certfilename, response.status_code) 

def generate_cert_file(filename): 
    cert_text=('''\ 
-----BEGIN CERTIFICATE----- 
MIIEgDCCA2igAwIBAgIIIxZ+YmNtB9AwDQYJKoZIhvcNAQELBQAwSTELMAkGA1UE 
BhMCVVMxEzARBgNVBAoTCkdvb2dsZSBJbmMxJTAjBgNVBAMTHEdvb2dsZSBJbnRl 
cm5ldCBBdXRob3JpdHkgRzIwHhcNMTUwOTA5MjI1MzM5WhcNMTUxMjA4MDAwMDAw 
WjBoMQswCQYDVQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwN 
TW91bnRhaW4gVmlldzETMBEGA1UECgwKR29vZ2xlIEluYzEXMBUGA1UEAwwOd3d3 
Lmdvb2dsZS5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDqH1dz 
jOr385g9DXVZowTLkhjCoYGQ/zOLzslSFowYqZnlMiE7iZ8Vm9/iJfhStSMoA6gZ 
87uqLENCi3NK+pk4+n1SIPRZS0jorb1jsyenMMy6Fxb9sQe3ndqZpWBtsW5ezW9t 
7q5HWA1cNm1KSi2fmwZpDrSaN0TYQdFbRAz6cPf6J/P66qyEC7OInFgLsy4FDdp8 
itpjCo/gnk2gz1vpWjiRYLCkz/dlFY3M3kR/s7YcJa7UP7BZ+QmmDfN3y4mxmEfn 
Cg8rB25ZbD+oQ+Hua3/oMrx4r3lliou3yrD08/ABEqs16EEPX5wFHtI4CQYAUt5E 
rEDl36bpvFD0QkfLAgMBAAGjggFLMIIBRzAdBgNVHSUEFjAUBggrBgEFBQcDAQYI 
KwYBBQUHAwIwGQYDVR0RBBIwEIIOd3d3Lmdvb2dsZS5jb20waAYIKwYBBQUHAQEE 
XDBaMCsGCCsGAQUFBzAChh9odHRwOi8vcGtpLmdvb2dsZS5jb20vR0lBRzIuY3J0 
MCsGCCsGAQUFBzABhh9odHRwOi8vY2xpZW50czEuZ29vZ2xlLmNvbS9vY3NwMB0G 
A1UdDgQWBBQHiMS+8X3+WcfbMQymf9yX9XA1yDAMBgNVHRMBAf8EAjAAMB8GA1Ud 
IwQYMBaAFErdBhYbvPZotXb1gba7Yhq6WoEvMCEGA1UdIAQaMBgwDAYKKwYBBAHW 
eQIFATAIBgZngQwBAgIwMAYDVR0fBCkwJzAloCOgIYYfaHR0cDovL3BraS5nb29n 
bGUuY29tL0dJQUcyLmNybDANBgkqhkiG9w0BAQsFAAOCAQEAUvY5/JbZLfahjC4F 
IZU0jVtGRBDa6tXLhCHAdwLHYLQdHn74oQ8Y1vxL0AYd7V2SBAgrDjCoK9bDQbQi 
UZ7xwG9K2O75bS2qYc/OlZLJr0Gdfs71ZpQzlv14SGBXvwPuD6noj+hiZjqICd6t 
3Rd5oIFiZvkhNDdN6Uag28rIfR8HECdlkbZNZeLZnyoIaxsprANvlEkY0wEbn1K9 
kww3/SYKbdPJ8VQSUOtWgGsO1RPFaE4PP7hCg8Q062+mmCs0ZMQSvrzzv7JQsO5J 
EkdG6691HdVA6z/rRGGX8E6assTnJLmVMxRayV+Do07KvywLONTInUWue8heHUSX 
EHJZbg== 
-----END CERTIFICATE-----\ 
''') 
    with open(filename, "wb") as output: 
     output.write(cert_text) 

if __name__=='__main__': 
    run_tests() 

Я делаю что-то неправильно здесь? (Я встроил сертификат inline, чтобы сделать код проще для запуска без необходимости предоставления отдельного файла сертификата)

Я получаю «запросы» от репозитория git - самая новая версия TAG в истории - V2.7.0 и последний коммит является «46ff1a9a543cc4d33541aa64c94f50f0a698736e»

EDIT: Я на самом деле был неправильный сертификат здесь (спасибо Штеффен Ульрих за указание на это), но я теперь подтвердил я есть правильный CERT/конечная точка: и я получаю то же самое ошибка.

Я извлек серт так:

openssl s_client -connect www.google.com:443 

И просто скопировал CERT детали в программу питона. Проблема на самом деле происходит и для моих собственных собственных систем - с использованием самозаверяющих сертификатов (что является моим реальным прецедентом).

В качестве альтернативы: где опция 'verify = True' действительно ищет доверенные сертификаты/центры сертификации? (На Java это будет «cacerts» - не знаете, что эквивалентно здесь для Python/запросов?).

Я на платформе Windows здесь.

ответ

0

Вы можете попробовать это:

s = Session() 
req = Request('POST', 'https://www.google.com') 
prepped = s.prepare_request(req) 
resp = s.send(prepped, verify=False, cert=CERT_PATH) 
if resp.status_code == 200:... 
+0

Какие импортные товары необходимы для этого? Я получаю «NameError: name« Session »не определен» - я попробовал «запросы», «urllib», «urlib2», но не смог заставить их работать. Cheers John – monojohnny

+0

привет, я думаю, вам нужно это: из запросов import Request, Session – Hetdev

3

Вы используете сертификат, который действителен только для www.google.com, то, но доступ к www.google.com. Таким образом, сертификат не может совпадать. И я не уверен, что использование сертификата хоста вместо сертификата эмитента (т. Е. Корневого ЦС или промежуточного ЦС) будет работать вообще.

+0

Спасибо: я исправил это, но все равно получаю ту же проблему - см. EDIT. Cheers John – monojohnny

+0

@monojohnny: вы используете листовой сертификат, но можете себе привести: «Я не уверен, что использование сертификата хоста вместо сертификата эмитента (т. Е. Корневого СА или промежуточного ЦС) будет работать вообще». Что касается реальной проблемы с самозаверяющим сертификатом: убедитесь, что для этого сертификата флаг CA установлен в true, иначе вы, вероятно, столкнетесь с проблемами. –

+0

Я дважды проверю это; Я не думал, что мне нужно включить флаг «CA» в самозаверяющем сертификате, но это вполне возможно, что реализация проверки сертификатов на Python учитывает это, я думаю ... Я буду придется потратить некоторое время на тестирование, и я обновлю здесь, как только получаю шанс - спасибо! – monojohnny

Смежные вопросы