Requests ProxyError privaatsel API-l? Kontrollige esmalt keskkonda
Requests ühendab puhverserveri, autentimise ja CA seaded keskkonnast. Lugege, mida protsess näeb, välistage privaatne host ja jätke TLS-i kontroll sisse.
VPN töötab, sisemine armatuurlaud avaneb brauseris ja Pythoni skript viskab ikkagi puhverserveri vea. Sellel pildil pole tunneliga midagi valesti: interpretaator loeb puhverserveri aadressi oma keskkonnast ja saadab päringu sinna. See juhend loeb keskkonda, mida protsess tegelikult näeb, rakendab kitsaimat erandit ja alles siis kaalub selgesõnalist sessioonipoliitikat. Iga samm lõpeb käsuga, mille väljund otsustab, kas jätkate.
Lugege keskkonda, mida protsess tegelikult näeb
Töölaua puhverserveri seaded, shelli ekspordid ja systemd-üksuse Environment= read on kolm erinevat allikat ning Requests loeb ainult viimast, mille ta pärib. Käivitage allolev diagnostika samas shellis, konteineris või üksuses, mis käivitab nurjuva skripti, mitte oma interaktiivses terminalis. Sisselogimisshellis eksporditud muutuja on konteineri protsessile nähtamatu ja see lünk seletab paljusid teateid puhverserverist, mis ilmub eikusagilt. Kaks käsku prindivad samu andmeid erineva detailsusega.
env | grep -i -E 'proxy|requests_ca_bundle|curl_ca_bundle'
python3 -c "import os;[print(k,'=',v) for k,v in sorted(os.environ.items()) if 'proxy' in k.lower()]"
Loetakse mõlemat kirjaviisi iga muutuja puhul ja duplikaadid rakendatakse selles järjekorras, milles protsess need sai, seega võib vananenud HTTP_PROXY alistada väärtuse, mille just eksportisite. CA-kimbu muutujad on siin samuti olulised, sest need muudavad, milleks verify laheneb, ilmumata kuskil koodis. Kui väljund on tühi, pole keskkond teie probleem ja võite selle jaotise lugemise lõpetada. Kui see loetleb puhverserveri, mida te ei tunne, leidke fail või üksus, mis selle määrab, enne kui midagi muudate.
Küsige Requestsilt, mida ta konkreetse URL-iga teeks. See kutse näitab selle päringu ühendatud puhverserveri, verify ja cert väärtusi ilma paketti saatmata.
python3 -c "import requests;s=requests.Session();print(s.merge_environment_settings('https://api.corp.example/status',{},None,None,None))"
Mitte-tühi proxies kirje privaatse hosti jaoks on teie vastus ja prinditud verify väärtus ütleb, millist CA-kimpu päring usaldaks. Kui mõlemad tunduvad õiged, on viga hiljem virnas ja peaksite liikuma kontrollijaotisse. Ärge oletage koodi põhjal: ühendamine toimub päringu kaupa, mistõttu üks sessioon võib kahe hosti puhul käituda erinevalt.
Välistage privaatne host enne, kui midagi välja lülitate
Kui puhverserver on teiste sihtkohtade jaoks tõesti vajalik, on kitsas parandus selle hosti erand. Lisage olemasolevale loendile, mitte ärge asendage seda, sest NO_PROXY kustutamine rikub iga teise sisemise sihtkoha, mis sellele lootis. Allolevad käsud lisavad kirje ja küsivad seejärel Requestsilt, kas möödaviik kehtib.
export NO_PROXY="${NO_PROXY:+$NO_PROXY,}api.corp.example,.corp.example"
python3 -c "import requests;print(requests.utils.should_bypass_proxies('https://api.corp.example/status',None))"
Sobitamine käib hosti sufiksi järgi, seega .corp.example katab kogu domeeni, samal ajal kui api.corp.example katab ühe nime. Paljas tärn lülitab puhverserveri välja iga hosti jaoks ja on peaaegu kunagi see, mida tootmistöö tahab. Kas CIDR-kirjet arvestatakse, sõltub pildis olevatest Requestsi ja urllib3 versioonidest, seega testige täpset kirjet, mitte ärge eeldage, et see töötab. Kontrollige should_bypass_proxies tulemust tegeliku URL-i jaoks, mitte mälust trükitud hostinime jaoks.
Hoidke kaks kihti peas eraldi. HTTP-puhverserverist möödaminek ei möödu VPN-ist, sest puhverserveri otsus tehakse teegis ja tunneli otsus kerneli marsruutimistabelis.
Lülitage trust_env välja ainult teadliku sessioonipoliitikana
Kui kogu töö peaks ümbritsevat konfiguratsiooni eirama, ehitage sessioon selgesõnaliselt ja registreerige otsus koodis. See on poliitika, mitte möödaviik, ja see kuulub diffi, mida ülevaataja näeb. Allolev näide säilitab ajapiirangu, selgesõnalise CA-tee ja olekukontrolli.
import requests
with requests.Session() as session:
session.trust_env = False
response = session.get(
"https://api.corp.example/status",
timeout=(5, 20),
verify="/etc/ssl/certs/corp-ca.pem",
)
response.raise_for_status()
trust_env väljalülitamine muudab korraga kolme käitumist ja ainult üks neist puudutab puhverserverit. Requests lõpetab .netrc mandaatide lugemise ning muutujad REQUESTS_CA_BUNDLE ja CURL_CA_BUNDLE lõpetavad verify mõjutamise, mis seejärel langeb tagasi kaasasolevasse sertifikaadihoidlasse. Kui teie organisatsioon lõpetab TLS-i oma CA-ga, tekitab see tagasilangus kontrollivea, mis näib olevat seotud muudatusega, mille just tegite. Just verify selgesõnaline edastamine hoiab kaks mõju lahus.
Mida te ei peaks tegema, on verify=False seadmine, et tulenevat viga vaigistada. See vahetab vale puhverserveri konfiguratsiooni kontrollimata ühenduse vastu ja peidab sertifikaadiprobleemi, mille erand pidi paljastama.
Kontrollige nurjuvat kihti ja hoidke tagasipööramise võimalust
Kolm tõrget näevad logis ühesugused välja ja neil pole midagi ühist: sihtkohta mittejõudev puhverserver viskab ProxyError või tagastab 502, usaldusprobleem viskab SSLError ja rakenduse keeldumine tagastab 401 või 403. Taasesitage päring väljaspool Requestsi, et näha, milline neist teil on. Allolevad käsud eemaldavad puhverserveri, testivad sertifikaadiahelat ja kordavad seejärel kõne teegi kaudu.
curl -sv --noproxy '*' https://api.corp.example/status -o /dev/null
openssl s_client -connect api.corp.example:443 -servername api.corp.example </dev/null
python3 -c "import requests;r=requests.get('https://api.corp.example/status',timeout=10);print(r.status_code)"
Kui curl-kutse õnnestub ja Pythoni kutse nurjub, on keskkond ikkagi erinevus. Kui mõlemad nurjuvad TLS-i etapis, polnud puhverserver kunagi probleem ja probleem on sertifikaadiahelas. Kui mõlemad tagastavad 401, jõudis päring rakenduseni ja ülejäänud töö on autentimine. Selle ülesmärkimine, millist kolmest nägite, säästab järgmisele inimesele tunni.
Tagasipööramine on üks rida mõlemas suunas: eemaldage erand või lülitage trust_env tagasi. Salvestage eelmine NO_PROXY väärtus enne, kui sellele midagi lisada, ja eelistage ümbris-skripti või üksuse tasandi Environment= kirjet ekspordile, mis elab ainult teie terminali ajaloos. Mõlemad muudatused on protsessi keskkonnas nähtavad, seega taaskäivitamine viib teid tavaliselt vana käitumise juurde tagasi.
Lõpetage nelja asja kinnitamisega: privaatse URL-i ühendatud seaded ei näita ühtegi puhverserverit, sertifikaat valideerub kavandatud CA vastu, päring tagastab oleku, mida ootate, ja muudatus on commititud kohas, mida saab korrata. Roheline skript seletamata keskkonnaga on parandus, mis läheb järgmisel masinal jälle katki. Selle juhendi käsud on need, mille kleepite piletisse.