Проксийн ард 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 |