pip check_hostname greška iza proxyja: pip ili tunel?
Dvije različite greške ispisuju istu pip poruku o imenu hosta iza proxyja. Razlikujte zastario klijent od proxyja koji ponovno potpisuje saobraćaj, pa popravite pravi sloj.
Dvije različite greške ispisuju isti pip traceback, a popravka koja odgovara jednoj drugu pogoršava. Klijent prestar da imenuje tunelirani host treba nadogradnju. Proxy koji ponovno potpisuje saobraćaj treba pouzdan korijenski certifikat, a ne vraćanje na stariju verziju. Utvrdite koja je od dvije kod vas prije nego uredite proxy varijablu, jer putevi vode u suprotnim smjerovima.
Pročitajte zadnje okvire prije nego dirnete postavke
Mjesto gdje traceback završava kaže vam koji je sloj odustao. Ako završni okviri sjede unutar TLS koda urllib3 koji pip nosi sa sobom i tekst se žali na ime hosta, klijentska biblioteka nije mogla dovršiti korak provjere, a to je problem verzije mnogo češće nego problem certifikata. Ako tekst umjesto toga prijavljuje odbijenu vezu, neriješeno ime proxyja ili grešku HTTP 407, kriv je krajnji tunelski endpoint i nikakva nadogradnja to neće promijeniti.
Zabilježite verziju pipa i proxy varijable u istoj ljusci koja pada. Ljuska otvorena prije nego što se tunel podigao nosi druge vrijednosti od one otvorene poslije, a razlika među njima često je cijela dijagnoza.
python3 -m pip --version
env | grep -i -E 'proxy|no_proxy'
Kada je klijent stariji od tunela
Starija izdanja pipa nosila su HTTPS stog koji je gubio odredišno ime hosta kad bi socket bio umotan tunelom. Poruka check_hostname je ono što taj stog ispisuje kada stigne do provjere bez imena za usporedbu. Nadogradnja uklanja grešku jer noviji klijent čuva ime kroz rukovanje, a promjena je dovoljno jeftina da se prvo pokuša kad završni okviri pokazuju na ugrađeni TLS kod.
Ako se indeksu ne može pristupiti s mašine koja pada, preuzmite aktualni wheel na hostu koji može i instalirajte iz datoteke. Koristite ime datoteke koju ste zaista preuzeli, a ne verziju kopiranu iz blog posta.
python3 -m pip install --upgrade pip
python3 -m pip install ./pip-24.2-py3-none-any.whl
Kada proxy ponovno potpisuje saobraćaj
Proxy koji prekida TLS i ponovno izdaje certifikate pod korporativnim korijenom proizvodi drugu grešku: certificate verify failed, a ne žalbu na ime hosta. Ta razlika je trag, jer je klijent stigao do servera i zatim odbio identitet koji mu je pokazan. Popravka je eksplicitno vjerovati tom korijenu, bilo za jednu naredbu bilo kroz varijablu PIP_CERT, kako bi klijent mogao izgraditi lanac do onoga što proxy predstavlja. Dodavanje korijena u sistemsku pohranu povjerenja također radi, ali mijenja povjerenje za svaki program na mašini, što je veća odluka od popravljanja jedne instalacije paketa.
Držite --trusted-host kao dijagnostičko sredstvo, nikad kao stalno stanje. On isključuje provjeru koju ste pokušavali zadržati, pa ispravno pogrešan certifikat poslije izgleda zdrav. Ako ste ga upotrijebili da instalirate jedan paket, uklonite ga i popravite lanac prije sljedećeg izdanja.
Vaš vlastiti Python kod potpuno zanemaruje pip konfiguraciju. Poziv requests treba proxy i paket predane tamo gdje ih ta sesija vidi, zato blok ispod postavlja oboje na objekt sesije.
pip install --cert /usr/local/share/ca-certificates/corp-root.crt requests
export PIP_CERT=/usr/local/share/ca-certificates/corp-root.crt
s = requests.Session()
s.proxies = {"https": "http://10.20.30.40:8080"}
s.verify = "/usr/local/share/ca-certificates/corp-root.crt"
s.get("https://pypi.org/simple/", timeout=15)
Kada su endpoint ili port pogrešni
Klijent tunela često prepisuje sistemski proxy dok se povezuje, što pip može ostaviti usmjeren na host koji nikad ne odgovara na tom portu. Testirajte endpoint klijentom koji nije pip prije nego promijenite bilo koju pip postavku. Ako curl padne s istim proxy argumentom, greška je iznad pipa i nikakva količina konfiguracije unutar pipa neće pomoći.
Zastavica naredbe i varijable okoline govore istu stvar za različite opsege: zastavica važi za jedan poziv, varijable za svaki proces pokrenut poslije. Dodajte NO_PROXY za interni indeks da privatni promet paketa preskoči obilazak kroz tunel.
curl -x http://proxy.corp.internal:8080 --head https://pypi.org/simple/
pip install --proxy http://proxy.corp.internal:8080 requests
Sačuvajte postavku i dokažite da put radi
Pohranite proxy u pipovu vlastitu konfiguraciju kad treba nadživjeti trenutnu ljusku, pa pročitajte što će pip zaista koristiti. Debug izlaz imenuje datoteku i varijablu iza svake vrijednosti, što rješava rasprave o prioritetu brže od čitanja dokumentacije.
Provjera namjerno koristi dva klijenta. Zahtjev standardne biblioteke dokazuje rutu i lanac povjerenja, dok preuzimanje dokazuje da se pipova vlastita konfiguracija s njima slaže. Kada prvi uspije a drugi padne, razlika je unutar pipa, a ne u mreži.
pip config set global.proxy http://proxy.corp.internal:8080
pip config debug
python3 -c "import urllib.request as r; print(r.urlopen('https://pypi.org/simple/').status)"
pip download --no-deps -d /tmp/wheelcheck requests
| What you see | First command | Repair |
|---|---|---|
| hostname message inside vendored TLS frames | python3 -m pip --version | upgrade the client |
| certificate verify failed after the tunnel | curl -x http://proxy.corp.internal:8080 --head https://pypi.org/simple/ | trust the corporate root |
| connection refused or HTTP 407 | env | grep -i -E 'proxy|no_proxy' | correct host, port or credentials |