ਪ੍ਰੌਕਸੀ ਪਿੱਛੇ 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 |