Gwall ProxyError Requests ar API breifat? Edrychwch ar yr amgylchedd yn gyntaf
Mae Requests yn cyfuno gosodiadau proxy, auth a CA o'r amgylchedd. Darllenwch yr hyn y mae'r broses yn ei weld, eithriwch y gwesteiwr preifat, a chadwch ddilysu TLS ymlaen.
Mae'r VPN ymlaen, mae'r dangosfwrdd mewnol yn agor mewn porwr, ac mae'r sgript Python yn dal i godi gwall proxy. Nid oes dim o'i le ar y twnnel yn y darlun hwnnw: mae'r dehonglydd yn darllen cyfeiriad proxy o'i amgylchedd ei hun ac yn anfon y cais yno. Mae'r rhedlyfr hwn yn darllen yr amgylchedd y mae'r broses yn ei weld mewn gwirionedd, yn cymhwyso'r eithriad culaf, ac yn unig wedyn yn ystyried polisi sesiwn penodol. Mae pob cam yn gorffen â gorchymyn y mae ei allbwn yn penderfynu a ydych yn parhau.
Darllenwch yr amgylchedd y mae'r broses yn ei weld mewn gwirionedd
Mae gosodiadau proxy'r bwrdd gwaith, allforion y plisgyn a llinellau Environment= uned systemd yn dair ffynhonnell wahanol, ac nid yw Requests yn darllen ond yr un olaf y mae'n ei hetifeddu. Rhedwch y diagnostig isod yn yr un plisgyn, cynhwysydd neu uned sy'n rhedeg y sgript sy'n methu, nid yn eich terfynell ryngweithiol. Mae newidyn a allforiwyd yn eich plisgyn mewngofnodi yn anweledig i broses cynhwysydd, ac mae'r bwlch hwnnw'n esbonio llawer o adroddiadau am proxy sy'n ymddangos o nunlle. Mae'r ddau orchymyn yn argraffu'r un data ar wahanol lefelau o fanylder.
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()]"
Darllenir dwy sillafiad pob newidyn, a chymhwysir cofnodion dyblyg yn y drefn y cafodd y broses nhw, felly gall HTTP_PROXY hen orchfygu'r gwerth y gwnaethoch ei allforio gynnau. Mae newidynnau pecyn CA yn bwysig yma hefyd, oherwydd maen nhw'n newid at beth y mae verify yn datrys heb ymddangos yn unman yn y cod. Os yw'r allbwn yn wag, nid yr amgylchedd yw eich problem a gallwch stopio darllen yr adran hon. Os yw'n rhestru proxy nad ydych yn ei adnabod, dewch o hyd i'r ffeil neu'r uned sy'n ei osod cyn i chi newid unrhyw beth.
Gofynnwch i Requests beth fyddai'n ei wneud ag URL penodol. Mae'r alwad hon yn dangos y gwerthoedd proxy, verify a cert cyfun ar gyfer y cais hwnnw heb anfon pecyn.
python3 -c "import requests;s=requests.Session();print(s.merge_environment_settings('https://api.corp.example/status',{},None,None,None))"
Cofnod proxies nad yw'n wag ar gyfer y gwesteiwr preifat yw eich ateb, ac mae'r gwerth verify a argraffwyd yn dweud pa becyn CA y byddai'r cais yn ymddiried ynddo. Os yw'r ddau yn edrych yn gywir, mae'r methiant yn hwyrach yn y pentwr a dylech neidio i'r adran ddilysu. Peidiwch â dyfalu o'r cod: mae'r cyfuno yn digwydd fesul cais, a dyna pam y gall un sesiwn ymddwyn yn wahanol i ddau westai.
Eithriwch y gwesteiwr preifat cyn i chi analluogi unrhyw beth
Pan fo'r proxy wir ei angen ar gyfer cyrchfannau eraill, yr atgyweiriad cul yw eithriad ar gyfer y gwesteiwr hwn. Ychwanegwch at y rhestr bresennol yn hytrach na'i disodli, oherwydd mae dileu NO_PROXY yn torri pob cyrchfan fewnol arall a oedd yn dibynnu arno. Mae'r gorchmynion isod yn ychwanegu'r cofnod ac yna'n gofyn i Requests a yw'r osgoi yn gymwys.
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))"
Mae paru yn ôl ôl-ddodiad y gwesteiwr, felly mae .corp.example yn cwmpasu'r parth cyfan tra bo api.corp.example yn cwmpasu un enw. Mae seren noeth yn analluogi proxy ar gyfer pob gwesteiwr ac yn anaml iawn yw'r hyn y mae swydd gynhyrchu ei eisiau. Mae a yw cofnod CIDR yn cael ei barchu yn dibynnu ar fersiynau Requests ac urllib3 yn y ddelwedd, felly profwch y cofnod union yn hytrach na chymryd yn ganiataol ei fod yn gweithio. Gwiriwch ganlyniad should_bypass_proxies ar gyfer yr URL go iawn, nid ar gyfer enw gwesteiwr y gwnaethoch ei deipio o'r cof.
Cadwch y ddwy haen ar wahân yn eich meddwl. Nid yw osgoi'r proxy HTTP yn osgoi'r VPN, oherwydd mae penderfyniad y proxy yn digwydd yn y llyfrgell a phenderfyniad y twnnel yn digwydd yn nhabl llwybreiddio'r cnewyllyn.
Analluogwch trust_env dim ond fel polisi sesiwn bwriadol
Os dylai'r swydd gyfan anwybyddu ffurfweddiad amgylchynol, adeiladwch y sesiwn yn benodol a chofnodwch y penderfyniad mewn cod. Polisi yw hwn, nid gwaith osgoi, ac mae'n perthyn i diff y gall adolygydd ei weld. Mae'r enghraifft isod yn cadw terfyn amser, llwybr CA penodol a gwiriad statws.
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()
Mae diffodd trust_env yn newid tri ymddygiad ar unwaith, a dim ond un ohonynt yn ymwneud â proxy. Mae Requests yn stopio darllen credlynnau .netrc, ac mae'r newidynnau REQUESTS_CA_BUNDLE a CURL_CA_BUNDLE yn stopio effeithio ar verify, sydd wedyn yn disgyn yn ôl i'r storfa dystysgrifau sydd wedi'i chynnwys. Os yw eich sefydliad yn terfynu TLS gyda'i CA ei hun, mae'r cwymp yn ôl hwnnw yn codi gwall dilysu sy'n edrych yn ddi-gysylltiad â'r newid y gwnaethoch ei wneud gynnau. Trosglwyddo verify yn benodol sy'n cadw'r ddau effaith ar wahân.
Yr hyn na ddylech ei wneud yw gosod verify=False i dawelu'r gwall sy'n deillio o hynny. Mae hynny'n cyfnewid camgyfluniad proxy am gysylltiad heb ei ddilysu, ac mae'n cuddio'r broblem dystysgrif yr oedd yr eithriad i fod i'w datgelu.
Dilyswch yr haen sy'n methu a chadwch ffordd i droi'n ôl
Mae tri methiant yn edrych yr un fath mewn log ac nid oes ganddynt ddim yn gyffredin: mae proxy na all gyrraedd y cyrchfan yn codi ProxyError neu'n dychwelyd 502, mae problem ymddiriedaeth yn codi SSLError, ac mae gwrthodiad cais yn dychwelyd 401 neu 403. Atgynhyrchwch y cais y tu allan i Requests i weld pa un sydd gennych. Mae'r gorchmynion isod yn tynnu'r proxy, yn profi'r gadwyn dystysgrifau, ac yna'n ailadrodd yr alwad trwy'r llyfrgell.
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)"
Os yw'r alwad curl yn llwyddo ac mae'r alwad Python yn methu, yr amgylchedd yw'r gwahaniaeth o hyd. Os yw'r ddau yn methu yn ystod TLS, nid oedd y proxy byth yn broblem a'r gadwyn dystysgrifau sydd. Os yw'r ddau yn dychwelyd 401, mae'r cais wedi cyrraedd y cymhwysiad a'r gwaith sy'n weddill yw dilysu. Mae cofnodi pa un o'r tri a welsoch yn arbed awr i'r person nesaf.
Mae troi'n ôl yn un llinell i'r naill gyfeiriad neu'r llall: tynnwch yr eithriad, neu fflipiwch trust_env yn ôl. Cadwch y gwerth NO_PROXY blaenorol cyn i chi ychwanegu ato, a ffafriwch sgript lapio neu gofnod Environment= ar lefel uned dros allforiad sy'n byw yn hanes eich terfynell yn unig. Mae'r ddau newid yn weladwy yn amgylchedd y broses, felly mae ailgychwyn fel arfer yn eich dychwelyd i'r hen ymddygiad.
Gorffennwch trwy gadarnhau pedwar peth: nid yw'r gosodiadau cyfun ar gyfer yr URL preifat yn dangos unrhyw proxy, mae'r dystysgrif yn dilysu yn erbyn y CA a fwriadwyd, mae'r cais yn dychwelyd y statws yr ydych yn ei ddisgwyl, ac mae'r newid wedi'i gyflawni yn rhywle y gellir ei atgynhyrchu. Mae sgript werdd ag amgylchedd heb esboniad yn atgyweiriad sy'n torri eto ar y peiriant nesaf. Y gorchmynion yn y rhedlyfr hwn yw'r rhai i'w pastio i'r tocyn.