Прокси артындағы pip check_hostname қатесі: pip пе әлде туннель бе?
Прокси артында екі түрлі ақау бірдей pip хост атауы қатесін шығарады. Ескірген клиентті трафикті қайта қол қоятын проксиден ажыратып, дұрыс қабатты жөндеңіз.
Екі түрлі ақау бірдей pip ізін шығарады, ал біреуіне сай жөндеу екіншісін нашарлатады. Туннельден өткен хостты атауға тым ескі клиентке жаңарту қажет. Трафикке қайта қол қоятын проксиге сенімді тамыр сертификаты керек, нұсқаны төмендету емес. Прокси айнымалысын өңдеуден бұрын осы екеуінің қайсысы сізде екенін анықтаңыз, өйткені жолдар қарама-қарсы бағыттарға барады.
Параметрлерге қол тигізбес бұрын соңғы кадрларды оқыңыз
Іздің қай жерде аяқталатыны қай қабаттың берілгенін айтады. Егер жабылатын кадрлар pip-пен бірге келетін urllib3 TLS кодының ішінде болса және мәтін хост атауына шағымданса, клиент кітапханасы тексеру қадамын аяқтай алмаған, және бұл сертификат мәселесіне қарағанда нұсқа мәселесі әлдеқайда жиі. Егер мәтін оның орнына қабылданбаған қосылым, шешілмеген прокси атауы немесе HTTP 407 қатесі туралы хабарласа, туннельдің соңғы нүктесі кінәлі және ешбір жаңарту оны өзгертпейді.
pip нұсқасын және прокси айнымалыларын сол сәтсіз болған қабықшада түсіріңіз. Туннель көтерілмес бұрын ашылған қабықша одан кейін ашылғаннан басқа мәндерді ұстайды, және олардың арасындағы айырмашылық көбіне бүкіл диагностика болады.
python3 -m pip --version
env | grep -i -E 'proxy|no_proxy'
Клиент туннельден ескі болғанда
pip-тің ескі шығарылымдары сокет туннельмен қапталғаннан кейін межелі хост атауын жоғалтатын HTTPS стекін қамтыған. check_hostname хабарламасы — бұл стек салыстыруға атау жоқ күйде тексеруге жеткенде шығаратын хабарлама. Жаңарту ақауды жояды, өйткені жаңа клиент қол алысу барысында атауды сақтайды, және жабылатын кадрлар бірге келетін TLS кодын көрсеткенде бұл өзгеріс бірінші сынап көруге лайық арзан.
Егер индекске сәтсіз машинадан қол жеткізу мүмкін болмаса, мүмкіндігі бар хостта ағымдағы wheel алып, файлдан орнатыңыз. Блог жазбасынан көшірілген нұсқаның орнына нақты жүктеген файл атауын пайдаланыңыз.
python3 -m pip install --upgrade pip
python3 -m pip install ./pip-24.2-py3-none-any.whl
Прокси трафикке қайта қол қойғанда
TLS-ті аяқтайтын және сертификаттарды корпоративтік тамыр астында қайта шығаратын прокси басқа қате туғызады: certificate verify failed, хост атауына шағым емес. Дәл осы айырмашылық ишара, өйткені клиент серверге жетіп, содан кейін өзіне көрсетілген сәйкестікті қабылдамады. Жөндеу — сол тамырға ашық түрде сену, не бір пәрмен үшін, не PIP_CERT айнымалысы арқылы, сонда клиент прокси ұсынатын нәрсеге тізбек құра алады. Тамырды жүйенің сенім қоймасына қосу да жұмыс істейді, бірақ ол машинадағы әрбір бағдарламаның сенімін өзгертеді, және бұл бір пакет орнатуын жөндеуден үлкенірек шешім.
--trusted-host-ты диагностика ретінде ұстаңыз, ешқашан тұрақты күй ретінде емес. Ол сіз сақтағысы келген тексеруді өшіреді, сондықтан шынымен қате сертификат кейін сау болып көрінеді. Егер оны бір пакетті орнату үшін қолдансаңыз, оны алып тастап, келесі шығарылымға дейін тізбекті жөндеңіз.
Сіздің жеке Python кодыңыз pip конфигурациясын мүлдем елемейді. requests шақыруы прокси мен буманы сол сессия көретін жерге беруді қажет етеді, сондықтан төмендегі блок екеуін де сессия нысанына қояды.
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)
Соңғы нүкте немесе порт қате болғанда
Туннель клиенті қосылу кезінде жүйелік проксиді жиі қайта жазады, бұл pip-ті сол портта ешқашан жауап бермейтін хостқа бағыттап қоюы мүмкін. Кез келген pip параметрін өзгертудің алдында соңғы нүктені pip емес клиентпен тексеріңіз. Егер curl сол прокси аргументімен сәтсіз болса, ақау pip-тен жоғарыда және pip ішіндегі ешбір конфигурация көмектеспейді.
Пәрмен жалауы мен орта айнымалылары әртүрлі ауқымдарға бірдей нәрсені айтады: жалау бір шақыруға, айнымалылар кейін іске қосылған әрбір процеске қатысты. Ішкі индекске NO_PROXY қосыңыз, жеке пакет трафигі туннель арқылы айналма жолды өткізіп жіберсін.
curl -x http://proxy.corp.internal:8080 --head https://pypi.org/simple/
pip install --proxy http://proxy.corp.internal:8080 requests
Параметрді сақтап, жолдың жұмыс істейтінін дәлелдеңіз
Проксиді ағымдағы қабықшадан ұзақ өмір сүруі керек болса, pip-тің өз конфигурациясында сақтаңыз, содан кейін pip шынымен нені қолданатынын оқыңыз. debug шығысы әр мәннің артындағы файл мен айнымалыны атайды, бұл басымдық туралы дауларды құжаттаманы оқығаннан жылдамырақ шешеді.
Тексеру әдейі екі клиентті пайдаланады. Стандартты кітапхана сұранысы маршрутты және сенім тізбегін дәлелдейді, ал жүктеу pip-тің өз конфигурациясы олармен келісетінін дәлелдейді. Біріншісі сәтті болып, екіншісі сәтсіз болса, айырмашылық желіде емес, pip ішінде.
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 |