programing

Windows에서 pip에서 사용하는 CA Store에 사용자 지정 CA 루트 인증서를 추가하는 방법은 무엇입니까?

stoneblock 2023. 5. 14. 10:05

Windows에서 pip에서 사용하는 CA Store에 사용자 지정 CA 루트 인증서를 추가하는 방법은 무엇입니까?

.org 에서 했는데 python.org 에서 Python3 하는 데 .pip기본적으로 여기 네트워크에는 자체 인증서로 모든 SSL 연결을 종료하여 모든 패킷(ssl 포함)을 검사하는 중간 패킷 검사 어플라이언스가 있습니다.GPO의 일부는 사용자 지정 루트 인증서를 Windows Keystore에 푸시합니다.

Java를 사용할 때 외부 https 사이트에 액세스해야 하는 경우 자체 서명된 CA 인증서를 신뢰하려면 JVM의 캐럿을 수동으로 업데이트해야 합니다.

파이썬에 대해 어떻게 수행합니까?지금, 다음을 사용하여 패키지를 설치하려고 할 때pip당연히, 나는 멋진 사람이 됩니다.[SSL: CERTIFICATE_VERIFY_FAILED]오류

저는 제가 그들을 무시할 수 있다는 것을 깨달았습니다.--trusted-host매개 변수입니다. 그러나 설치하려는 모든 패키지에 대해 이 작업을 수행하지는 않습니다.

파이썬이 사용하는 CA 인증서 저장소를 업데이트할 수 있는 방법이 있습니까?

된 인증 pip/conda

Git와 유사한 문제를 광범위하게 문서화한 후(Git가 자체 서명된 인증서를 수락하도록 하려면 어떻게 해야 합니까?), 여기서는 신뢰해야 하는 MitM "공격"을 제공하는 프록시가 있는 기업 방화벽 뒤에 다시 있습니다.

모든 SSL 확인을 사용하지 않도록 설정하지 마십시오!

이것은 나쁜 보안 문화를 만듭니다.그런 사람이 되지 마세요.

업데이트 2022 Python 3.10

을 사용할 수 .truststorehttps://pip.pypa.io/en/latest/user_guide/ #시스템 신뢰 저장소를 사용하는 것은 로그인을 위한 것입니다.

# Requires Python 3.10 or later
python --version
Python 3.10.4

# Install the 'truststore' package from PyPI
python -m pip install truststore


# Use '--use-feature=truststore' flag to enable
python -m pip install SomePackage --use-feature=truststore

tl;dr: 자체 신뢰 저장소 CA 번들 구성

pip config set global.cert path/to/ca-bundle.crt
pip config list
conda config --set ssl_verify path/to/ca-bundle.crt
conda config --show ssl_verify

# Bonus while we are here...
git config --global http.sslVerify true
git config --global http.sslCAInfo path/to/ca-bundle.crt

서 얻을 수 있습니까?ca-bundle.crt?


최신 CA 번들 가져오기

cURL은 Mozilla Firefox와 함께 번들로 제공되는 인증 기관의 추출을 게시합니다.

https://curl.haxx.se/docs/caextract.html

이걸 열어보시길 권합니다.cacert.pem이 파일에 자체 서명 CA를 추가해야 하므로 텍스트 편집기에 파일을 추가합니다.

인증서는 X.509를 준수하는 문서이지만 몇 가지 방법으로 디스크에 인코딩할 수 있습니다.아래 기사는 좋은 내용이지만 짧은 버전은 파일 확장자에서 종종 PEM이라고 불리는 base64 인코딩을 다루고 있다는 것입니다.다음과 같은 형식을 사용하는 것을 참조하십시오.

----BEGIN CERTIFICATE----
....
base64 encoded binary data
....
----END CERTIFICATE----

https://support.ssl.com/Knowledgebase/Article/View/19/0/der-vs-crt-vs-cer-vs-pem-certificates-and-how-to-convert-them


자체 서명된 인증서 가져오기

다음은 자체 서명된 인증서를 얻는 방법에 대한 몇 가지 옵션입니다.

  • OpenSSL CLI를 통해
  • 브라우저를 통해
  • Python 스크립팅을 통해

OpenSSL CLI를 통해 자체 서명된 인증서 가져오기

https://unix.stackexchange.com/questions/451207/how-to-trust-self-signed-certificate-in-curl-command-line/468360#468360

echo quit | openssl s_client -showcerts -servername "curl.haxx.se" -connect curl.haxx.se:443 > cacert.pem

브라우저를 통해 자체 서명된 인증 기관 가져오기

이 답변과 연결된 블로그 덕분에 (Windows에서) base64 PEM 인코딩 옵션을 사용하여 인증서를 보고 파일에 복사하는 방법을 보여줍니다.

내보낸 의 내용을 하여 파일 .cacerts.pemjava.

을 위해 이 을 일관을이파이변름경으로 합니다.cacerts.pem-->ca-bundle.crt다음과 같은 쉬운 곳에 배치합니다.

# Windows
%USERPROFILE%\certs\ca-bundle.crt

# Linux/macOS
$HOME/certs/cabundle.crt

Python을 통해 자체 서명된 인증 기관 가져오기

다음과 같은 훌륭한 답변 덕분입니다.

파이썬에서 요청에서 응답 SSL 인증서를 가져오는 방법은 무엇입니까?

저는 한 걸음 더 나아가기 위해 다음 사항들을 정리했습니다.

https://github.com/neozenith/get-ca-py


마침내.

추가 자체 서명된 CA가 있는 이 CA 저장소의 위치를 알 수 있도록 구성을 pip 및 conda로 설정합니다.

# Windows
pip config set global.cert %USERPROFILE%\certs\ca-bundle.crt
conda config --set ssl_verify %USERPROFILE%\certs\ca-bundle.crt

OR

# Linux / macOS
pip config set global.cert $HOME/certs/ca-bundle.crt
conda config --set ssl_verify $HOME/certs/ca-bundle.crt

그리고나서

pip config list
conda config --show ssl_verify

# Hot tip: use -v to show where your pip config file is...
pip config list -v
# Example output for macOS and homebrew installed python
For variant 'global', will try loading '/Library/Application Support/pip/pip.conf'
For variant 'user', will try loading '/Users/jpeak/.pip/pip.conf'
For variant 'user', will try loading '/Users/jpeak/.config/pip/pip.conf'
For variant 'site', will try loading '/usr/local/Cellar/python/3.7.4/Frameworks/Python.framework/Versions/3.7/pip.conf'

문제 해결

아래의 훌륭한 의견을 바탕으로 합니다.

나는 이것을 시도해봤지만 여전히.SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1123)'))오류입니다. 어떤 제안이 있습니까?

다음은 문제 해결 가이드입니다.

인증 기관이 아직 올바르게 설정되지 않은 경우 일반적인 오류 메시지입니다.

다음과 같은 다양한 요인을 확인할 수 있습니다.

  • ca-bundle.crt의 경로는 OS에 적합한 경로 구분 기호를 가지고 있습니다(나는 그것이 괴롭습니다).
  • 정상적인 인증서를 확인할 수 있는 최신 CA가 없을 수 있습니다.
  • 올바른 인코딩에 CA를 추가하지 않았을 수 있습니다.

Python은 다음 3단계를 효과적으로 수행하고 있습니다.

  • 내 CA 스토어를 찾아서,
  • 모든 항목 읽기,
  • 내 트러스트 스토어에서 이 인증서를 검색합니다.

이 중 하나라도 실패하면 경험에서 이 오류 메시지가 표시됩니다.

아래에서 연결된 이 답변을 확인하여 표시하고 확인하십시오.ssl_cert_dir매개 변수:

python -c "import ssl; print(ssl.get_default_verify_paths())"

레퍼런스

실행:python -c "import ssl; print(ssl.get_default_verify_paths())"인증서를 확인하는 데 사용되는 현재 경로를 확인합니다.이 중 하나에 회사의 루트 인증서를 추가합니다.

openssl_capath_env변수를 . 환경 가는점키 리:SSL_CERT_DIR.

한다면SSL_CERT_DIR존재하지 않습니다. 파일 시스템 내의 유효한 폴더를 생성하여 가리켜야 합니다.그런 다음 이 폴더에 인증서를 추가하여 사용할 수 있습니다.

Windows에서 대안 솔루션은 Python-certificate-win32를 설치하여 Python이 Windows 인증서 저장소를 사용할 수 있도록 하는 것입니다.

pip install python-certifi-win32

이미 을 사용하여 할 수 .--cert.pip예를 들어:

pip install SQLAlchemy==1.1.15 --cert="C:\Users\myUser\certificates\my_ca-bundle.crt"

Windows에서는 %APPDA에 pip.ini 파일을 생성하여 해결했습니다.TA%\pip\

예: C:\Users\asmith\AppData\Roaming\pip\pip.이니

pip.ini에서 인증서 경로를 입력했습니다.

[global]
cert=C:\Users\asmith\SSL\teco-ca.crt

https://pip.pypa.io/en/stable/user_guide/ #configuration에는 구성 파일에 대한 자세한 정보가 있습니다.

기본 Windows 인프라(인증서 저장소)를 활용하기 때문에 nt86의 솔루션이 가장 적합하다고 생각합니다.하지만 pip가 작동하지 않기 때문에 python-certificate-win32를 설치하는 방법을 설명하지 않습니다.

요령은 사용하는 것입니다.--trustedhostpython-certificate-win32를 설치한 후 pip은 Windows 인증서 저장소를 사용하여 프록시에서 사용하는 인증서를 자동으로 로드합니다.

즉, 다음과 같은 작업을 수행해야 합니다.

pip install python-certifi-win32 -trustedhost pypi.org

그리고 그 후에 당신은 가도 좋습니다.

제 시나리오에서는 Python 3.8을 사용하는 Ubuntu에서 사용자 지정 CA와 자체 서명 인증서를 활용할 수 있는 로컬 시스템(코드나 새 패키지 설치 대신)에서 무엇을 변경할 수 있는지 확인하려고 했습니다.

그래서 저는 파이썬이 어디를 보고 있는지 추적했습니다.

strace python my_prog 2> out.txt

그런 다음 pem에 대한 출력을 grep합니다("crt" "cert"를 찾아야 할 수도 있습니다).

grep -i pem out.txt

인증서가 명시적으로 설치된 적은 없지만 찾고 있는 파일은 다음과 같습니다.

/path/to/virtualenv/for/project/lib/python3.8/site-packages/certifi/cacert.pem

그래서 이전 파일의 이름을 바꾸고 시스템의 ca 번들(예: /etc/ssl/certs/ca-certificates.crt)에 연결했습니다.

그리고 이제 효과가 있었습니다.

저는 조쉬의 "역대 최고의 응답"이나 rfKortteka에 대해 덜 서사적이지만 평판 포인트가 너무 적기 때문에 유용한 것이라고 말할 수 없습니다. 그래서 여기 또 다른 힌트가 있습니다.이 오류의 경우:

SSL 오류(SSL CertVerificationError(1, '[SSL: CERTIFIC_VERIFY_FAILED] 인증서 확인 실패: 로컬 발급자 인증서(_ssl.c:1123)를 가져올 수 없음) 오류입니다.

내가 찾고 추가하도록 요구했습니다.cacerts.pem/ca-bundle.crt

  • 중간 인증 기관용 인증서(추가하려고 시도한 자체 서명 인증서용)
  • 해당 중간 CA에 대한 중간 루트 인증서

certmgr.msc에서 올바른 인증서를 내 컴퓨터로 내보냄으로써 이를 얻었습니다(기업-vpn-hell 종류의 상황이며, pip & certificate만 해당되며, 다른 답변에 나열된 방법은 사용할 수 없습니다).또한 환경 변수를 추가할 경우 컴퓨터를 다시 시작해야 함을 알려줍니다.SSL_CERT_DIR,SSL_CERT_FILE가 없는 것 ;) 작동하않것같습니다는지)▁;다▁)같니 ;)

아나콘다 네비게이터를 엽니다.

파일\환경설정으로 이동합니다.

SSL 확인 사용 안 함(권장되지 않음)

또는 SSL 인증서 경로 사용 및 표시(선택사항)

패키지를 특정 버전으로 업데이트:

오른쪽 상단에 설치 선택

패키지 선택 클릭

업데이트 표시

특정 버전 설치 표시

적용 클릭

언급URL : https://stackoverflow.com/questions/39356413/how-to-add-a-custom-ca-root-certificate-to-the-ca-store-used-by-pip-in-windows