VPN er í gangi, innra stjórnborðið opnast í vafra, og Python-skrifta kastar samt proxyvillu. Það er ekkert athugavert við göngin á þeirri mynd: túlkurinn les proxyvistfang úr eigin umhverfi og sendir beiðnina þangað. Þessi handbók les umhverfið sem ferlið sér í raun, beitir þrengstu undantekningunni og íhugar aðeins þá skýra lotustefnu. Hvert skref endar á skipun sem úttak hennar ræður því hvort þú heldur áfram.

Lestu umhverfið sem ferlið sér í raun

Proxy-stillingar skjáborðsins, útflutningar í skel og Environment= línur systemd-einingar eru þrjár mismunandi uppsprettur, og Requests les aðeins þá síðustu sem það erfir. Keyrðu greininguna hér að neðan í sömu skel, gámi eða einingu og keyrir skriftuna sem mistekst, ekki í gagnvirka flugstöðinni þinni. Breyta sem flutt er út í innskráningarskelinni þinni er ósýnileg gámaferli, og það bil skýrir margar tilkynningar um proxy sem birtist úr engu. Skipanirnar tvær prenta sömu gögn á mismunandi smáatriðastigi.

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

Báðar stafsetningar hverrar breytu eru lesnar, og tvítekin færslur eru beitt í þeirri röð sem ferlið fékk þær, þannig að úrelt HTTP_PROXY getur yfirskýrt gildið sem þú fluttir út rétt í þessu. CA-bunka breyturnar skipta líka máli hér, því þær breyta því hvað verify leysist í án þess að sjást nokkurs staðar í kóðanum. Ef úttakið er tómt er umhverfið ekki þitt vandamál og þú getur hætt að lesa þennan hluta. Ef það telur upp proxy sem þú þekkir ekki, finndu skrána eða eininguna sem stillir það áður en þú breytir nokkru.

Spyrðu Requests hvað það myndi gera við tiltekið URL. Þetta kall sýnir sameinuð proxy-, verify- og cert-gildi fyrir þá beiðni án þess að senda pakka.

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

Ekki tóm proxies færsla fyrir einkavélina er svarið þitt, og prentaða verify gildið segir þér hvaða CA-bunka beiðnin myndi treysta. Ef bæði líta rétt út er bilunin lengra niðri í staflanum og þú ættir að hoppa í staðfestingarhlutann. Giskaðu ekki á kóðann: sameiningin á sér stað fyrir hverja beiðni, þess vegna getur ein lota hagað sér öðruvísi fyrir tvær vélar.

Útilokaðu einkavélina áður en þú slökkvir á nokkru

Þegar proxy er sannarlega nauðsynlegt fyrir önnur áfangastaði er þrönga lagaferlið undantekning fyrir þessa vél. Bættu við núverandi lista í stað þess að skipta honum út, því að þurrka NO_PROXY brýtur hvern annan innri áfangastað sem reiddi sig á það. Skipanirnar hér að neðan bæta færslunni við og spyrja svo Requests hvort framhjáhlaupið eigi við.

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

Samsvörun er eftir viðskeyti vélar, svo .corp.example nær yfir allt lénið á meðan api.corp.example nær yfir eitt nafn. Bert stjörnumerki slökkvir á proxy fyrir hverja vél og er næstum aldrei það sem framleiðsluverk vill. Hvort CIDR-færsla er virt fer eftir útgáfum Requests og urllib3 í myndinni, svo prófaðu nákvæmu færsluna í stað þess að gera ráð fyrir að hún virki. Athugaðu niðurstöðu should_bypass_proxies fyrir raunverulega slóð, ekki fyrir vélarheiti sem þú slóst inn úr minni.

Haltu lögunum tveimur aðskildum í huganum. Að fara fram hjá HTTP-proxy fer ekki fram hjá VPN, því ákvörðun proxysins er tekin í bókasafninu og ákvörðun ganganna í leiðartöflu kjarnans.

Slökktu á trust_env aðeins sem viljandi lotustefnu

Ef allt verkið á að hunsa umhverfisstillingar skaltu byggja lotuna skýrt og skrá ákvörðunina í kóðann. Það er stefna, ekki vinnutilfærsla, og hún á heima í diffi sem yfirferðarmaður sér. Dæmið hér að neðan heldur tímatakmörkun, skýrri CA-slóð og stöðuathugun.

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

Að slökkva á trust_env breytir þremur hegðunum í einu, og aðeins ein þeirra snýr að proxy. Requests hættir að lesa .netrc skilríki, og breyturnar REQUESTS_CA_BUNDLE og CURL_CA_BUNDLE hætta að hafa áhrif á verify, sem fellur þá aftur á innbyggða vottorðasafnið. Ef stofnunin þín lýkur TLS með eigin CA veldur þessi afturhvarf staðfestingarvillu sem virðist ótengd breytingunni sem þú varst að gera. Það er skýr miðlun verify sem heldur áhrifunum tveimur aðskildum.

Það sem þú ættir ekki að gera er að setja verify=False til að þagga niður villuna sem verður til. Það skiptir rangri proxy-stillingu fyrir óstaðfesta tengingu og felur vottorðavandamálið sem undantekningunni var ætlað að afhjúpa.

Staðfestu laginu sem mistekst og haltu afturkvæmni

Þrjár bilanir líta eins út í annál og eiga ekkert sameiginlegt: proxy sem nær ekki áfangastað kastar ProxyError eða skilar 502, traustvandamál kastar SSLError, og höfnun forrits skilar 401 eða 403. Endurgerðu beiðnina utan Requestss til að sjá hverja þú hefur. Skipanirnar hér að neðan fjarlægja proxysið, prófa vottorðakeðjuna og endurtaka svo kallið í gegnum bókasafnið.

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

Ef curl-kallið heppnast og Python-kallið mistekst er umhverfið enn munurinn. Ef bæði mistekst á TLS-stigi var proxy aldrei vandamálið og vottorðakeðjan er það. Ef bæði skila 401 náði beiðnin forritinu og eftir er auðkenning. Að skrá hverja af þremur þú sást sparar næsta manni klukkustund.

Afturkvæmni er ein lína í hvora áttina: fjarlægðu undantekninguna eða snúðu trust_env til baka. Geymdu fyrra NO_PROXY gildið áður en þú bætir við það, og veldu umbúðaskrift eða Environment= færslu á einingarstigi fram yfir útflutning sem lifir aðeins í flugstöðvarferilsögu þinni. Báðar breytingarnar eru sýnilegar í umhverfi ferlisins, svo endurræsing færir þig venjulega aftur í gömlu hegðunina.

Ljúktu með því að staðfesta fjóra hluti: sameinuðu stillingarnar fyrir einkaslóðina sýna ekkert proxy, vottorðið staðfestist gagnvart fyrirhuguðu CA, beiðnin skilar stöðunni sem þú býst við, og breytingin er commit-uð á stað sem hægt er að endurgera. Græn skrifta með óútskýrðu umhverfi er lagfæring sem brotnar aftur á næstu vél. Skipanirnar í þessari handbók eru þær sem á að líma í miðann.

Tengdir greinar