VPN on päällä, sisäinen hallintapaneeli avautuu selaimessa ja Python-skripti heittää silti välityspalvelinvirheen. Tuossa kuvassa tunnelissa ei ole mitään vialla: tulkki lukee välityspalvelimen osoitteen omasta ympäristöstään ja lähettää pyynnön sinne. Tämä ohje lukee ympäristön, jonka prosessi todella näkee, soveltaa kapeinta poissulkemista ja vasta sen jälkeen harkitsee nimenomaista istuntokäytäntöä. Jokainen vaihe päättyy komentoon, jonka tuloste ratkaisee, jatkatko.

Lue ympäristö, jonka prosessi todella näkee

Työpöydän välityspalvelinasetukset, shellin viennit ja systemd-yksikön Environment=-rivit ovat kolme eri lähdettä, ja Requests lukee vain viimeisen perimänsä. Suorita alla oleva diagnostiikka samassa shellissä, kontissa tai yksikössä, joka suorittaa epäonnistuvan skriptin, älä interaktiivisessa päätteessäsi. Kirjautumisshellissäsi viety muuttuja on näkymätön konttiprosessille, ja tämä aukko selittää monet raportit välityspalvelimesta, joka ilmestyy tyhjästä. Kaksi komentoa tulostavat samat tiedot eri yksityiskohtaisuustasoilla.

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

Kummastakin kirjoitusasusta luetaan molemmat, ja kaksoiskappaleet sovelletaan siinä järjestyksessä, jossa prosessi ne vastaanotti, joten vanhentunut HTTP_PROXY voi ohittaa juuri viemäsi arvon. CA-nippumuuttujat ovat täällä myös tärkeitä, koska ne muuttavat, mihin verify ratkeaa, näkymättä missään koodissa. Jos tuloste on tyhjä, ympäristö ei ole ongelmasi ja voit lopettaa tämän osion lukemisen. Jos se luettelee välityspalvelimen, jota et tunnista, etsi tiedosto tai yksikkö, joka asettaa sen, ennen kuin muutat mitään.

Kysy Requestilta, mitä se tekisi tietyllä URL-osoitteella. Tämä kutsu näyttää kyseisen pyynnön yhdistetyt välityspalvelin-, verify- ja cert-arvot lähettämättä pakettia.

python3 -c "import requests;s=requests.Session();print(s.merge_environment_settings('https://api.corp.example/status',{},None,None,None))"

Ei-tyhjä proxies-merkintä yksityiselle isännälle on vastauksesi, ja tulostettu verify-arvo kertoo, mihin CA-nippuun pyyntö luottaisi. Jos molemmat näyttävät oikeilta, vika on myöhemmin pinossa ja sinun kannattaa siirtyä tarkistusosioon. Älä arvaa koodista: yhdistäminen tapahtuu pyyntökohtaisesti, minkä vuoksi yksi istunto voi käyttäytyä eri tavalla kahdelle isännälle.

Sulje yksityinen isäntä pois ennen kuin poistat mitään käytöstä

Kun välityspalvelinta todella tarvitaan muihin kohteisiin, kapea korjaus on tämän isännän poissulkeminen. Lisää olemassa olevaan luetteloon sen sijaan, että korvaisit sen, koska NO_PROXY:n pyyhkiminen rikkoo jokaisen muun sisäisen kohteen, joka luotti siihen. Alla olevat komennot lisäävät merkinnän ja kysyvät sitten Requestilta, soveltuuko ohitus.

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

Sovitus tapahtuu isännän jälkiliitteen mukaan, joten .corp.example kattaa koko toimialueen ja api.corp.example yhden nimen. Paljas tähti poistaa välityspalvelimen käytöstä jokaiselta isännältä, eikä se ole lähes koskaan sitä, mitä tuotantotyö haluaa. CIDR-merkinnän huomioiminen riippuu imagen Requests- ja urllib3-versioista, joten testaa täsmällinen merkintä sen sijaan, että oletat sen toimivan. Tarkista should_bypass_proxies:n tulos todelliselle URL-osoitteelle, älä muistista kirjoittamallesi isäntänimelle.

Pidä kaksi kerrosta erillään mielessäsi. HTTP-välityspalvelimen ohittaminen ei ohita VPN:ää, koska välityspalvelinpäätös tehdään kirjastossa ja tunnelipäätös ytimen reititystaulussa.

Poista trust_env käytöstä vain tietoisena istuntokäytäntönä

Jos koko työn pitää jättää ympäristön asetukset huomiotta, rakenna istunto nimenomaisesti ja kirjaa päätös koodiin. Se on käytäntö, ei kiertotie, ja se kuuluu diffiin, jonka katselmoija näkee. Alla oleva esimerkki säilyttää aikakatkaisun, nimenomaisen CA-polun ja tilan tarkistuksen.

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:n poistaminen käytöstä muuttaa kolmea toimintatapaa kerralla, ja vain yksi niistä liittyy välityspalvelimeen. Requests lakkaa lukemasta .netrc-tunnuksia, ja muuttujat REQUESTS_CA_BUNDLE ja CURL_CA_BUNDLE lakkaavat vaikuttamasta verify:ään, joka silloin palaa mukana tulevaan varmennevarastoon. Jos organisaatiosi päättää TLS:n omalla CA:llaan, tuo varautuminen nostaa varmennusvirheen, joka näyttää liittymättömältä juuri tekemääsi muutokseen. Nimenomainen verify:n välittäminen pitää kaksi vaikutusta erillään.

Sitä sinun ei pitäisi tehdä, että asetat verify=False:n vaientaaksesi syntyvän virheen. Se vaihtaa välityspalvelimen virheellisen määrityksen varmistamattomaan yhteyteen ja piilottaa varmenneongelman, joka poissulkemisen oli tarkoitus paljastaa.

Tarkista epäonnistuva kerros ja pidä palautusmahdollisuus

Kolme vikaa näyttävät lokissa samalta eikä niillä ole mitään yhteistä: välityspalvelin, joka ei tavoita kohdetta, heittää ProxyError tai palauttaa 502, luottamusongelma heittää SSLError, ja sovelluksen hylkäys palauttaa 401 tai 403. Toista pyyntö Requestsin ulkopuolella nähdäksesi, mikä niistä sinulla on. Alla olevat komennot poistavat välityspalvelimen, testaavat varmenneketjun ja toistavat sitten kutsun kirjaston kautta.

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

Jos curl-kutsu onnistuu ja Python-kutsu epäonnistuu, ympäristö on edelleen ero. Jos molemmat epäonnistuvat TLS-vaiheessa, välityspalvelin ei koskaan ollut ongelma ja varmenneketju on. Jos molemmat palauttavat 401, pyyntö saavutti sovelluksen ja jäljellä oleva työ on todennus. Sen kirjaaminen, minkä kolmesta havaitsit, säästää seuraavalta henkilöltä tunnin.

Palautus on yksi rivi kumpaankin suuntaan: poista poissulkeminen tai käännä trust_env takaisin. Tallenna edellinen NO_PROXY-arvo ennen kuin lisäät siihen, ja suosi kääreskriptiä tai yksikkötason Environment=-merkintää vientiin, joka elää vain päätesi historiassa. Molemmat muutokset näkyvät prosessin ympäristössä, joten uudelleenkäynnistys palauttaa sinut yleensä vanhaan toimintatapaan.

Lopeta vahvistamalla neljä asiaa: yksityisen URL-osoitteen yhdistetyt asetukset eivät näytä välityspalvelinta, varmenne validoituu aiottua CA:ta vasten, pyyntö palauttaa odottamasi tilan ja muutos on commitoitu paikkaan, joka voidaan toistaa. Vihreä skripti selittämättömällä ympäristöllä on korjaus, joka hajoaa uudelleen seuraavalla koneella. Tämän ohjeen komennot ovat ne, jotka liität tikettiin.

Aiheeseen liittyvät artikkelit