자체 서명 된 SSL 인증서를 신뢰하기 위해 Python 요청을받는 방법은 무엇입니까?


82
import requests
data = {'foo':'bar'}
url = 'https://foo.com/bar'
r = requests.post(url, data=data)

URL이 자체 서명 된 인증서를 사용하는 경우 다음과 함께 실패합니다.

requests.exceptions.SSLError: [Errno 1] _ssl.c:507: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

나는 통과 할 수 있다는 것을 알고 False받는 사람 verify과 같이 매개 변수 :

r = requests.post(url, data=data, verify=False)

그러나 내가하고 싶은 것은 디스크의 공개 키 사본에 대한 요청을 지정하고 해당 인증서를 신뢰하도록 지시하는 것입니다.


답변:


60

시험:

r = requests.post(url, data=data, verify='/path/to/public_key.pem')

1
동일한 작업을 수행하고 동시에 클라이언트 인증서를 사용할 수 있습니까? 이것에 문제가 있습니다.
user1156544

9
전달하는 .pem 파일에는 서버의 인증서 와 모든 중간 인증서 가 포함되어야합니다 . 서버의 인증서를 추가 한 후 작동하지 않는 이유를 파악하는 데 몇 시간이 걸렸습니다.
ChrisBob

자체 서명 된 certificate.pem을 추가했는데 제대로 작동했습니다.
HS Rathore 2011

4
이 기술은 저에게 효과가 없었습니다. 에 ssl.get_server_certificate대한 인증서를 다운로드하고 해당 인증서를 (self-signed.badssl.com, 443)에 저장 cert.pem한 다음 실행 requests.get('https://self-signed.badssl.com/', verify='cert.pem')했지만 SSL 오류 (해당 인증서는 자체 서명 됨)와 함께 실패했습니다.
Jason R. Coombs

41

으로 verify매개 변수를 사용자 정의 인증 기관 번들을 제공 할 수 있습니다

requests.get(url, verify=path_to_bundle_file)

에서 워드 프로세서 :

verify신뢰할 수있는 CA의 인증서를 사용하여 CA_BUNDLE 파일의 경로를 전달할 수 있습니다 . 이 신뢰할 수있는 CA 목록은 REQUESTS_CA_BUNDLE 환경 변수를 통해 지정할 수도 있습니다.


2
명확하게하기 위해 하단 변형 cert=(...)은 상호 TLS라고도 하는 클라이언트 SSL 전용 입니다 . 흥미 롭기는하지만 질문이 무엇에 관한 것인지는 훨씬 드물고 실제로는 아닙니다.
Nick T

@ nick-t 의견 주셔서 감사합니다. 당신이 옳습니다, 나는 덜 장황하게 만들기 위해 답변의 하단 부분을 제거했습니다.
Dr. Jan-Philip Gehrcke

23

가장 쉬운 방법은 REQUESTS_CA_BUNDLE사설 인증 기관 또는 특정 인증서 번들을 가리키는 변수를 내보내는 것 입니다. 명령 줄에서 다음과 같이 할 수 있습니다.

export REQUESTS_CA_BUNDLE=/path/to/your/certificate.pem
python script.py

당신은 당신의 인증 기관을 가지고 있고 당신은 입력하지 않으려면 export당신이 추가 할 수 있습니다마다 REQUESTS_CA_BUNDLE에 당신의~/.bash_profile 로 다음을 :

echo "export REQUESTS_CA_BUNDLE=/path/to/your/certificate.pem" >> ~/.bash_profile ; source ~/.bash_profile

환경 변수는 PyCharm이 OpenSSL 인증서 파일에 저장된 인증서와 함께 작동하도록하는 데 필요한 것입니다.
Brady

체인에 자체 서명 된 인증서가 있습니다. 이 솔루션은 boto3 라이브러리의 문제를 해결했습니다.
Ilkin

6

여러 인증서가 필요한 경우 다음과 같이 해결되었습니다. 여러 루트 pem 파일 인 myCert-A-Root.pem 및 myCert-B-Root.pem을 파일에 연결합니다. 그런 다음 REQUESTS_CA_BUNDLE var 요청을 ./.bash_profile의 해당 파일로 설정하십시오.

$ cp myCert-A-Root.pem ca_roots.pem
$ cat myCert-B-Root.pem >> ca_roots.pem
$ echo "export REQUESTS_CA_BUNDLE=~/PATH_TO/CA_CHAIN/ca_roots.pem" >> ~/.bash_profile ; source ~/.bash_profile

그날의 "아"순간 이었어요 ... 고마워요 ...이 힌트와 함께 제 자신이 서명 한 지라 인증서를 받았습니다 ... ;-) 저는 이것을 설명하는 사이트와 답변이 많을 수도 있다는 것을 압니다. ,하지만 난 당신이 도와 내 신용을 얻을 수 있도록 내 probelm ... D를 해결, 당신을 발견
alexrjs

4

설정 export SSL_CERT_FILE=/path/file.crt이 작업을 수행해야합니다.


감사. 나를 위해 작동합니다 ( REQUESTS_CA_BUNDLE변수가 내 경우에는 영향을 미치지 않음).
Pascal H.

0

httplib2에 대한 CA (내 경우에는 Charles Proxy)를 추가하려고하는 사람이 여기에 착륙하는 경우 (내 경우에는 Charles Proxy) cacerts.txtPython 패키지에 포함 된 파일에 추가 할 수있는 것처럼 보입니다 .

예를 들면 :

cat ~/Desktop/charles-ssl-proxying-certificate.pem >> /usr/local/google-cloud-sdk/lib/third_party/httplib2/cacerts.txt

다른 솔루션에서 참조되는 환경 변수는 요청에 따라 다르며 테스트에서 httplib2에 의해 선택되지 않았습니다.


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