Dve rôzne zlyhania tlačia rovnakú stopu pip a oprava vhodná pre jedno zhorší to druhé. Klient príliš starý na to, aby pomenoval tunelovaného hostiteľa, potrebuje aktualizáciu. Proxy, ktorá znovu podpisuje prevádzku, potrebuje dôveryhodný koreňový certifikát, nie zníženie verzie. Zistite, ktorý z dvoch máte, skôr než upravíte premennú proxy, pretože cesty vedú opačnými smermi.

Prečítajte si posledné rámce, skôr než sa dotknete nastavení

Miesto, kde stopa končí, vám povie, ktorá vrstva to vzdala. Ak záverečné rámce sedia v TLS kóde urllib3 pribaleného k pip a text sa sťažuje na názov hostiteľa, klientská knižnica nemohla dokončiť krok overenia, a to je problém verzie oveľa častejšie než problém certifikátu. Ak text namiesto toho hlási odmietnuté pripojenie, nevyriešený názov proxy alebo chybu HTTP 407, na vine je koncový bod tunela a žiadna aktualizácia to nezmení.

Zachyťte verziu pip a premenné proxy v tom istom shelli, ktorý zlyháva. Shell otvorený pred tým, než tunel nabehol, nesie iné hodnoty než ten otvorený potom, a rozdiel medzi nimi je často celá diagnóza.

python3 -m pip --version
env | grep -i -E 'proxy|no_proxy'

Keď je klient starší ako tunel

Staršie vydania pip obsahovali zásobník HTTPS, ktorý stratil cieľový názov hostiteľa, hneď ako bol socket obalený tunelom. Správa check_hostname je to, čo tento zásobník vypíše, keď dosiahne overenie bez názvu na porovnanie. Aktualizácia odstráni chybu, pretože novší klient si názov počas potrasenia rúk ponechá, a zmena je dosť lacná na to, aby sa vyskúšala prvá, kedykoľvek záverečné rámce ukazujú na pribalený kód TLS.

Ak sa k indexu nedá dostať zo zlyhávajúceho stroja, stiahnite aktuálny wheel na hostiteľovi, ktorý to dokáže, a nainštalujte zo súboru. Použite názov súboru, ktorý ste skutočne stiahli, nie verziu skopírovanú z blogového príspevku.

python3 -m pip install --upgrade pip
python3 -m pip install ./pip-24.2-py3-none-any.whl

Keď proxy znovu podpisuje prevádzku

Proxy, ktorá ukončuje TLS a znovu vydáva certifikáty pod firemným koreňom, vytvára inú chybu: certificate verify failed, nie sťažnosť na názov hostiteľa. Ten rozdiel je stopa, pretože klient dosiahol server a potom odmietol identitu, ktorá mu bola ukázaná. Opravou je tejto koreňovej autorite výslovne dôverovať, či už pre jeden príkaz, alebo cez premennú PIP_CERT, aby si klient mohol postaviť reťaz k tomu, čo proxy predkladá. Pridanie koreňa do systémového úložiska dôvery tiež funguje, ale mení dôveru pre každý program na stroji, a to je väčšie rozhodnutie než oprava jednej inštalácie balíka.

--trusted-host majte ako diagnostiku, nikdy ako trvalý stav. Vypína kontrolu, ktorú ste sa snažili zachovať, takže skutočne nesprávny certifikát po tom vyzerá zdravo. Ak ste ho použili na inštaláciu jedného balíka, odstráňte ho a opravte reťaz pred ďalším vydaním.

Váš vlastný kód v Pythone úplne ignoruje konfiguráciu pip. Volanie requests potrebuje proxy a balík odovzdané tam, kde ich táto relácia vidí, preto blok nižšie nastavuje oboje na objekte relácie.

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)

Keď je koncový bod alebo port nesprávny

Klient tunela často prepisuje systémovú proxy pri pripájaní, čo môže nechať pip namierený na hostiteľa, ktorý na tom porte nikdy neodpovedá. Otestujte koncový bod klientom, ktorý nie je pip, skôr než zmeníte akékoľvek nastavenie pip. Ak curl zlyhá s tým istým argumentom proxy, chyba je nad pip a žiadna konfigurácia vnútri pip nepomôže.

Príznak príkazu a premenné prostredia hovoria to isté pre rôzne rozsahy: príznak platí pre jedno vyvolanie, premenné pre každý proces spustený potom. Pridajte NO_PROXY pre interný index, aby súkromná prevádzka balíkov vynechala obchádzku tunelom.

curl -x http://proxy.corp.internal:8080 --head https://pypi.org/simple/
pip install --proxy http://proxy.corp.internal:8080 requests

Uložte nastavenie a dokážte, že cesta funguje

Uložte proxy do vlastnej konfigurácie pip, keď má prežiť aktuálny shell, a potom si prečítajte, čo pip skutočne použije. Výstup debug pomenúva súbor a premennú za každou hodnotou, čo urovná spory o prioritu rýchlejšie než čítanie dokumentácie.

Overenie zámerne používa dvoch klientov. Požiadavka zo štandardnej knižnice dokazuje trasu a reťaz dôvery, zatiaľ čo stiahnutie dokazuje, že vlastná konfigurácia pip s nimi súhlasí. Keď prvé uspeje a druhé zlyhá, rozdiel je vnútri pip, nie v sieti.

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 seeFirst commandRepair
hostname message inside vendored TLS framespython3 -m pip --versionupgrade the client
certificate verify failed after the tunnelcurl -x http://proxy.corp.internal:8080 --head https://pypi.org/simple/trust the corporate root
connection refused or HTTP 407env | grep -i -E 'proxy|no_proxy'correct host, port or credentials

Súvisiace články