Python užklausa mesti SSLError

Dirbu paprastu scenariju, kuriame yra CAS, jspring saugumo patikrinimas, peradresavimas ir kt. Norėčiau naudoti Kenneth Reitz Python prašymus, nes tai puikus darbas! Tačiau CAS reikalauja, kad gautumėte patvirtinimą per SSL, todėl pirmiausia turiu eiti per šį žingsnį. Nežinau, ko nori Python? Kur turėtų būti šis SSL sertifikatas?

 Traceback (most recent call last): File "./test.py", line 24, in <module> response = requests.get(url1, headers=headers) File "build/bdist.linux-x86_64/egg/requests/api.py", line 52, in get File "build/bdist.linux-x86_64/egg/requests/api.py", line 40, in request File "build/bdist.linux-x86_64/egg/requests/sessions.py", line 209, in request File "build/bdist.linux-x86_64/egg/requests/models.py", line 624, in send File "build/bdist.linux-x86_64/egg/requests/models.py", line 300, in _build_response File "build/bdist.linux-x86_64/egg/requests/models.py", line 611, in send requests.exceptions.SSLError: [Errno 1] _ssl.c:503: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed 
176
19 мая '12 в 21:45 2012-05-19 21:45 TedBurrows paklausė gegužės 19 d. 12 val. 21:45 2012-05-19 21:45
@ 18 atsakymų

Problemą sukelia nepatikimas SSL sertifikatas.

Kaip ir ankstesniame komentare minėtas @ Dirk, sparčiausias sprendimas yra verify=False .

Atminkite, kad dėl to sertifikatas nebus patikrintas. Tai atskleidžia jūsų taikymą saugumo rizikai, pvz., Atakų centre metu.

Žinoma, taikykite teismą. Kaip minėta komentaruose, tai gali būti priimtina greitoms / išeinančioms programoms / scenarijams, tačiau jūs neturėtumėte iš tikrųjų naudotis programine įranga.

Jei tiesiog praleidžiate sertifikatų patikrinimą, kuris nėra priimtinas jūsų konkrečiame kontekste, apsvarstykite šias parinktis: geriausias variantas yra nustatyti verify parametrą į eilutę, kuri yra kelias į .pem sertifikato failą (kurį turėtumėte gauti naudodami tam tikras saugias priemones).

Taigi, pradedant nuo 2.0 versijos, verify parametras su atitinkamomis semantika atitinka šias reikšmes:

  • True : sertifikatas atpažįsta savo patikimų sertifikatų biblioteką (Pastaba: galite matyti, kurie root sertifikato prašymai yra naudojami naudojant „Certifi“ biblioteką, RC pasitikėjimo duomenų bazė, gauta iš užklausų: „ Certifi“ - žmonių duomenų bazė ).
  • False : visiškai apeina sertifikato patvirtinimą.
  • Kreiptis į CA_BUNDLE failą, jei norite patikrinti sertifikatus.

Šaltinis: užklausos - SSL sertifikato patikra

Taip pat apsvarstykite tos pačios nuorodos parinktį.

198
12 окт. atsakymas, kurį pateikė Rafael Almeida spalio 12 d 2012-10-12 21:19 '12, 21:19, 2012-10-12 21:19

SSL patvirtinimo dokumentų užklausų:

Prašymai gali patikrinti HTTPS užklausų SSL sertifikatus, taip pat žiniatinklio naršyklę. Jei norite patvirtinti SSG sertifikato šeimininką, galite naudoti patvirtinimo argumentą:

 >>> requests.get('https://kennethreitz.com', verify=True) 

Jei nenorite patikrinti savo SSL sertifikato, verify=False

80
19 мая '12 в 22:20 2012-05-19 22:20 atsakė Boudui gegužės 19 d., 12 val

CA failo, kurį galite naudoti, pavadinimas gali būti perduodamas per verify :

 cafile = 'cacert.pem' # http://curl.haxx.se/ca/cacert.pem r = requests.get(url, verify=cafile) 

Jei naudojate verify=True , requests naudoja savo CA rinkinį, kuris gali neturėti CA, kuris pasirašė jūsų serverio sertifikatą.

36
12 окт. atsakymas pateikiamas jfs 12 oct. 2012-10-12 21:38 '12, 09:38 PM 2012-10-12 21:38

$ pip install -U requests[security]

  • Išbandyta Python 2.7.6 @Ubuntu 14.04.4 LTS
  • Išbandyta „Python 2.7.5 @MacOSX 10.9.5“ („Mavericks“)

Kai šis klausimas buvo atidarytas (2012-05), užklausos versija buvo 0.13.1. 2.4.1 versija (2014-09) pridėjo papildomų saugumo funkcijų naudodama certifi paketą, jei ji yra.

Šiuo metu (2016-09) pagrindinė versija yra 2.11.1, kuri veikia be verify=False , naudojama kaip request.get requests.get(url, verify=False) jei įdiegta su papildomais requests[security] .

18
19 сент. atsakymas duotas alanjds 19 rugsėjis 2016-09-19 21:57 '16 at 9:57 pm 2016-09-19 21:57

Bėgau į tą pačią problemą, ir SSL sertifikatas patvirtino klaidą, kai naudojote aws boto3, peržiūrėdamas „boto3“ kodą, sužinojau, kad REQUESTS_CA_BUNDLE nebuvo įdiegta, todėl aš abu klausimus išsprendžiau įdiegus rankiniu būdu:

 from boto3.session import Session import os # debian os.environ['REQUESTS_CA_BUNDLE'] = os.path.join( '/etc/ssl/certs/', 'ca-certificates.crt') # centos # 'ca-bundle.crt') 

„Aws-cli“ manau, kad ~/.bashrc nustatymas į ~/.bashrc šią problemą (nebus išbandyta, nes mano „aws-cli“ veikia be jo).

 REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt # ca-bundle.crt export REQUESTS_CA_BUNDLE 
14
15 нояб. Atsakymas duotas „ Yong“ lapkričio 15 d. 2015-11-15 10:47 '15, 10:47 2015-11-15 10:47

Su „gspread“ susiduriu su ta pačia problema, ir šios komandos veikia man:

 sudo pip uninstall -y certifi sudo pip install certifi==2015.04.28 
13
16 февр. atsakymą pateikė vartotojo941581 vasario 16 d. 2016-02-16 07:53 '16 at 7:53 AM 2016-02-16 07:53

Radau konkretų požiūrį į šią problemą. Idėja nurodo sistemoje saugomą ir kitų SSL pagrindu naudojamų programų cacert failą.

Debian'e (aš nesu įsitikinęs, ar jis yra toks pat ir kitose platinimo vietose), sertifikato failai (.pem) yra saugomi /etc/ssl/certs/ Taigi, tai yra kodas, kuris veikia man:

 import requests verify='/etc/ssl/certs/cacert.org.pem' response = requests.get('https://lists.cacert.org', verify=verify) 

Jei norite atspėti, kurį pem pasirinkti, žiūriu į URL ir patikrinu, kuris sertifikatas (CA) sukūrė sertifikatą.

EDIT: jei negalite redaguoti kodo (nes naudojate trečiąją programą), galite pabandyti pridėti sertifikatą tiesiai į /usr/local/lib/python2.7/dist-packages/requests/cacert.pem (pvz., Nukopijuokite jį failo pabaigoje).

10
18 апр. atsakymas pateikiamas 18 d. 2013-04-18 17:29 '13, 17:29, 2013-04-18 17:29

Jei turite biblioteką, kuri remiasi requests , ir negalite keisti patvirtinimo kelio (pvz., Naudojant „ pyvmomi ), turėsite rasti cacert.pem su užklausomis ir pridėti savo CA. Čia pateikiamas bendras požiūris į cacert.pem vietą:

>

 C:\>python -c "import requests; print requests.certs.where()" c:\Python27\lib\site-packages\requests-2.8.1-py2.7.egg\requests\cacert.pem 

Linux

 # (py2.7.5,requests 2.7.0, verify not enforced) root@host:~/# python -c "import requests; print requests.certs.where()" /usr/lib/python2.7/dist-packages/certifi/cacert.pem # (py2.7.10, verify enforced) root@host:~/# python -c "import requests; print requests.certs.where()" /usr/local/lib/python2.7/dist-packages/requests/cacert.pem 

beje. @ request-devs, sujungiantys jūsų cacerts su prašymu, tikrai yra labai erzina ... ypač tai, kad, atrodo, nenaudojate „ca store“ sistemos, ir tai nėra dokumentuota niekur.

Atnaujinti

Tais atvejais, kai naudojate biblioteką ir nekontroliuojate paketo vietos, galite aiškiai nurodyti kazino vietą kaip laikrodžio paketą:

 REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-bundle.crt python -c "import requests; requests.get('https://somesite.com';)" 
8
04 марта '16 в 11:38 2016-03-04 11:38 atsakymas yra suteiktas tintin 04 kovo 16 d. 11:38 2016-03-04 11:38

Jei norite pašalinti įspėjimus, naudokite toliau pateiktą kodą.

 import urllib3 urllib3.disable_warnings() 

ir verify=False naudojant request.get arba post metodas

7
03 нояб. AniketGole atsakymas 03 lapkričio. 2015-11-03 10:42 '15, 10:42 AM 2015-11-03 10:42

Jei nesate susirūpinę dėl sertifikato, naudokite tik verify=False .

 import requests url = "Write your url here" returnResponse = requests.get(url, verify=False) 
7
21 мая '15 в 15:01 2015-05-21 15:01 atsakymas suteikiamas joggui prasadui gegužės 21 d., 15 val. 15:01 2015-05-21 15:01

Po kelių valandų derinimo galėčiau tik dirbti su šiais paketais:

 requests[security]==2.7.0 # not 2.18.1 cryptography==1.9 # not 2.0 

naudojant OpenSSL 1.0.2g 1 Mar 2016

verify=False neveikė be šių paketų.

Tikiuosi, kad tai padės kam nors.

6
20 июля '17 в 23:10 2017-07-20 23:10 Atsakymą pateikia michael, liepos 20 d. 17, 23:10 2017-07-20 23:10

Aš patyriau tą pačią problemą. Pasirodo, kad ne įdiegiau tarpinio sertifikato savo serveryje (tiesiog pridėkite jį prie sertifikato pabaigos, kaip parodyta žemiau).

https://www.digicert.com/ssl-support/pem-ssl-creation.htm

Įsitikinkite, kad įdiegėte ca-sertifikatų paketą:

 sudo apt-get install ca-certificates 

Laiko atnaujinimas taip pat gali išspręsti šiuos dalykus:

 sudo apt-get install ntpdate sudo ntpdate -u ntp.ubuntu.com 

Jei naudojate savarankiškai pasirašytą sertifikatą, gali tekti jį pridėti prie savo sistemos rankiniu būdu.

5
13 июня '14 в 22:19 2014-06-13 22:19 atsakymą pateikė Marius Craciunoiu birželio 14 d. 14 d. 10:19 2014-06-13 22:19

Aš susidūriau su šia problema dėl „WATCHES“.

Bandžiau atnaujinti užklausas. Tada atnaujinau sertifikatą. Aš pažymėjau, kad patikriname certifi.where () (kodas vis tiek tai daroma). Nieko neįvyko.

Galiausiai atnaujinau savo python versiją į python 2.7.11. Buvau 2.7.5 Python, kuris turėjo tam tikrus nesuderinamumus su sertifikatų tikrinimu. Kai tik atnaujinsiu „Python“ (ir keletą kitų priklausomybių), jis pradėjo dirbti.

3
07 мая '16 в 0:13 2016-05-07 00:13 atsakymą pateikė ajonas 07 gegužės 16 d. 0:13 2016-05-07 00:13

Užklausos modulyje šiuo metu yra klaida, kuri sukelia šią klaidą, pateikta v2.6.2 - v2.12.4 (ATOW): https://github.com/kennethreitz/requests/issues/2573

Šio klausimo sprendimas yra pridėti šią eilutę: requests.packages.urllib3.util.ssl_.DEFAULT_CIPHERS = 'ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS'

2
15 янв. atsakymą Petras davė sausio 15 d. 2017-01-15 23:10 '17 at 11:10 2017-01-15 23:10

Nepavyksta pridėti parinkčių, jei prašymai skambinami iš kito paketo. Tokiu atveju, pavyzdžiui, sertifikatų įtraukimas į cacert paketą yra paprastas būdas. Turėjau pridėti „StartCom Class 1 Primary Intermediate Server CA“, kuriam aš įkėliau šakninį sertifikatą į „StartComClass1.pem“. Kadangi mano virtualenv vadinamas „caldav“, pridėjau sertifikatą naudojant:

 cat StartComClass1.pem >> .virtualenvs/caldav/lib/python2.7/site-packages/pip/_vendor/requests/cacert.pem cat temp/StartComClass1.pem >> .virtualenvs/caldav/lib/python2.7/site-packages/requests/cacert.pem 

vienas iš jų gali būti pakankamas, aš netikrinau

0
03 авг. atsakymas duotas rhoerbe 03 rug . 2015-08-03 20:29 '15 at 8:29 pm 2015-08-03 20:29

Jei skambučių užklausos yra paslėptos kažkur giliai kode ir nenorite įdiegti serverio sertifikato, tada derinimo tikslais galite paprašyti „MonkeyPatch“:

 import requests.api import warnings def requestspatch(method, url, **kwargs): kwargs['verify'] = False return _origcall(method, url, **kwargs) _origcall = requests.api.request requests.api.request = requestspatch warnings.warn('Pathched requests: SSL verification disabled!') 

Niekada nenaudokite gamyboje!

0
29 авг. atsakymas duotas xmedeko 29 rug . 2017-08-29 09:06 '17 at 9:06 2017-08-29 09:06

Kaip jau minėjo @Rafael Almeida, problemą, su kuria susidūrėte, sukelia nepatikimas SSL sertifikatas. Mano atveju, mano serveris SSL sertifikatą nepasitikėjo. Norėdami tai apeiti nekeliant pavojaus saugumui, atsisiunčiau sertifikatą ir jį įdiegiau serveryje (tiesiog dukart spusteliu .crt failą, tada įdiegdamas sertifikatą ...).

0
14 июня '17 в 14:07 2017-06-14 14:07 Atsakymą pateikė Michael , birželio 14 d. 17, 14:07 2017-06-14 14:07

Turėjau tą pačią arba tą pačią sertifikato patvirtinimo problemą. Aš perskaičiau, kad OpenSSL versijos yra mažesnės nei 1.0.2, kurių užklausos kartais priklauso nuo tvirtų sertifikatų tikrinimo (žr. Čia ). Atrodo, kad CentOS 7 naudoja 1.0.1e, kuri, atrodo, turi problemų.

Aš nesu įsitikinęs, kaip šią problemą išspręsti CentOS, todėl nusprendžiau leisti silpnesnes licencijas 1024 bitų CA.

 import certifi # This should be already installed as a dependency of 'requests' requests.get("https://example.com", verify=certifi.old_where()) 
0
11 июля '17 в 16:26 2017-07-11 16:26 atsakymą pateikė Tim Ludwinski liepos 17 d., 16:26 2017-07-11 16:26

Kiti klausimai apie žymes arba Užduoti klausimą