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


83

방금 python.org에서 Python3을 설치했으며 pip. 설계 상 여기에는 자체 인증서로 모든 SSL 연결을 사임하여 모든 패킷 (SSL 포함)을 검사하는 중간자 패킷 검사 어플라이언스가 네트워크에 있습니다. GPO의 일부는 사용자 지정 루트 인증서를 Windows 키 저장소로 푸시합니다.

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

파이썬에서 어떻게 수행합니까? 지금 당장을 사용하여 패키지를 설치하려고하면 pip당연히 멋진 [SSL: CERTIFICATE_VERIFY_FAILED]오류가 발생합니다.

--trusted-host매개 변수를 사용하여 무시할 수 있다는 것을 알고 있지만 설치하려는 모든 패키지에 대해 그렇게하고 싶지는 않습니다.

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


4
@rfkortekaas 이러한 모든 옵션에는 프로세스에 새로운 것을 추가하는 것이 포함됩니다. Python은 시스템 어딘가에 저장된 기본 신뢰 저장소를 사용해야합니다. 해당 신뢰 저장소를 수정하고 싶습니다. 추가 변수, 다른 CA 저장소 등을 추가하고 싶지 않습니다. Java에서 jvm은 자체 신뢰 저장소 (OS와 별도)에 의존합니다. 내 루트 인증서가 내 Windows 저장소에 있고 파이썬에서 인식되지 않기 때문에 파이썬이 비슷한 작업을 수행해야한다고 생각합니다.
Eric B.

답변:


94

자체 서명 인증 기관 pip/conda

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

모든 SSL 확인을 비활성화하지 마십시오!

이것은 나쁜 보안 문화를 만듭니다. 그 사람이되지 마십시오.

tl; dr

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로 자체 서명 된 인증서 받기

/unix/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

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

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

이 내 보낸 파일의 내용을 복사하여 파일 끝에 붙여 넣습니다 cacerts.pem.

일관성을 위해이 파일의 이름을 cacerts.pem-> 바꾸고 다음 ca-bundle.crt과 같이 쉽게 배치하십시오.

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

# or *nix
$HOME/certs/cabundle.crt

Python을 통해 자체 서명 된 인증 기관 받기

모든 훌륭한 답변에 감사드립니다.

Python의 요청에서 응답 SSL 인증서를 얻는 방법은 무엇입니까?

나는 한 단계 더 나아 가기 위해 다음을 모았습니다.

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


드디어

이 CA 저장소가 추가 자체 서명 된 CA와 함께 상주하는 위치를 알 수 있도록 pip 및 conda에서 구성을 설정합니다.

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

또는

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'

참고 문헌



pip config set global.trusted-host XXXXX.com
zzzz zzzz

Windows에서는 인증서에 .pem 형식을 사용하여 작동합니다.
Daniel Argüelles 2019

1
@ DanielArgüelles 그래 맞아. 대부분의 경우 인증 기관 번들을 병합하지 않고 벗어날 수 있지만 pip 또는 conda가 다른 서버에 대한 인증서의 유효성을 검사 할 수 있도록 전체 번들이 필요한 충분한 시간을 보냈습니다. 궁극적으로 번들은 여전히 ​​많은 pem 파일의 내용을 포함하는 텍스트 파일입니다. 다행이었고 확인을 비활성화 할 필요가 없었습니다! : D
Josh Peak

42

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

경로 openssl_capath_env는 환경 변수를 가리 킵니다 SSL_CERT_DIR..

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


11
내 Windows 시스템에서는 Windows에서 사용할 수없는 '/ usr / local / ssl / certs'를 반환합니다.
Colin Talbert

1
나는 마침내 다른 프로젝트에 끌린 후에 이것을 수행했으며 @ColinTalbert와 유사하게 존재하지 않는 폴더를 가리 킵니다 /usr/local/ssl/certs.
Eric B.

나는 내 질문을 편집했으며 이것이 사건을 해결하기를 바랍니다.
rfkortekaas

1
@rfkortekaas SSL_CERT_FILE 또는 SSL_CERT_DIR 변수 업데이트가 작동하지 않았습니다. PEM 파일을 업데이트하는 방법에 대한 질문이 아니라 cygwin / Windows에서 올바른 경로에 액세스하도록 파이썬을 얻는 방법에 대한 질문 일 수 있으므로이 문제에 대한 새로운 SO 질문 을 만들었습니다 .
Eric B.

1
나는 시도했다. ~/.config/pip/pip.conf필요한 설정 으로 pip.conf 파일을 생성했습니다 . 이 답변을 참조하십시오 .
Eric B.

7

최선의 대답은 아니지만 --cert옵션을 사용하여 이미 생성 된 ca 번들을 재사용 할 수 있습니다 pip. 예를 들면 다음과 같습니다.

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

4

Windows에서는 % APPDATA % \ pip \에 pip.ini 파일을 만들어 해결했습니다.

예 : C : \ Users \ asmith \ AppData \ Roaming \ pip \ pip.ini

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

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

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


안녕하세요 Alex, pip.ini 파일에 인증서 경로를 어떻게 "입력"했습니까? 명령 줄에서? 메모장과 같은 곳에 파일 경로를 입력하고 텍스트 파일로 저장 했습니까? 아나콘다 프롬프트를 사용하고 있지만 창과 비슷하다고 생각합니다.
spacedustpi

메모장으로 텍스트 파일을 만든 다음 파일 확장자를 "txt"에서 "ini"로 변경했습니다.
Alex

아. 괜찮아. 경로 위에 "[gobal]"도 입력해야합니까? 이런 유형의 튜토리얼을 어디로 갈 수 있는지 아십니까? 감사.
spacedustpi

예, "[global]"도 입력해야합니다. 죄송합니다. 튜토리얼이 없지만 pip.pypa.io/en/stable/user_guide/#configuration 에 더 많은 정보가 있습니다.
Alex

감사합니다. 두 가지 방법을 모두 시도해 보았지만 "[global]"은 아프지 않습니다.
spacedustpi

1

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

pip install python-certifi-win32

-1

Anaconda Navigator를 엽니 다.

File \ Preferences로 이동합니다.

SSL 확인 활성화 비활성화 (권장하지 않음)

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

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

오른쪽 상단에 설치를 선택합니다.

패키지 선택 틱 클릭

업데이트 표시

특정 버전 설치 표시

적용을 클릭하십시오

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.