programing

Python 요청이 자체 서명된 SSL 인증서를 신뢰하도록 하는 방법은 무엇입니까?

goodsources 2023. 6. 10. 09:04
반응형

Python 요청이 자체 서명된 SSL 인증서를 신뢰하도록 하는 방법은 무엇입니까?

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)

그러나 디스크에 있는 공용 키 복사본에 대한 요청을 지정하고 해당 인증서를 신뢰하도록 지시합니다.

시도:

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

와 함께verify사용자 지정 인증 기관 번들을 제공할 수 있는 매개 변수

requests.get(url, verify=path_to_bundle_file)

문서에서:

합격할 수 있습니다verify신뢰할 수 있는 CA의 인증서가 있는 CA_BUNDLE 파일의 경로입니다.이 신뢰할 수 있는 CA 목록은 REQUESTS_CA_BUNDLE 환경 변수를 통해 지정할 수도 있습니다.

가장 쉬운 방법은 변수를 내보내는 것입니다.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

여러 개의 인증서가 필요한 경우는 다음과 같이 해결되었습니다.여러 루트 pem 파일인 myCert-A-Root.pem 및 myCert-B-Root.pem을 파일에 연결합니다.그런 다음 requests REQUEST_CA_BUNDLE var를 my ./.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

이 질문에 대한 모든 대답은 동일한 경로를 가리킵니다. PEM 파일을 가져오지만 웹 사이트에서 파일을 가져오는 방법은 알려주지 않습니다.

내부 회사 서버와 같이 사이트를 신뢰하는 경우 웹 사이트에서 PEM 파일을 가져오는 것 자체가 유효한 옵션입니다.사이트를 신뢰한다면 왜 이렇게 해야 합니까?안전하지 않은 사이트에서 실수로 코드를 재사용하지 않도록 자신과 다른 사용자를 보호하는 데 도움이 되므로 이 작업을 수행해야 합니다.

PEM 파일을 가져오는 방법은 다음과 같습니다.

  1. URL 옆에 있는 잠금을 클릭합니다.자물쇠를 클릭

  2. 인증서를 볼 수 있는 위치로 이동하여 인증서를 엽니다.인증서 보기로 이동

  3. PEM CERT 체인을 다운로드합니다.PEM 체인 다운로드

  4. .PEM 파일을 스크립트가 액세스할 수 있는 위치에 놓고 시도합니다.verify=r"path\to\pem_chain.pem"당신의 내부에requests불러.

r = requests.get(url, verify='\path\to\public_key.pem')

설정export SSL_CERT_FILE=/path/file.crt그 일을 해야 합니다.

저처럼 회사 네트워크 방화벽을 지원하는 경우 네트워크 관리자에게 회사 인증서 위치를 문의한 후 다음을 수행합니다.

import os
os.environ["REQUESTS_CA_BUNDLE"] = 'path/to/corporate/cert.pem'
os.environ["SSL_CERT_FILE"] = 'path/to/corporate/cert.pem'

요청 및 openssl과 관련하여 제가 가지고 있던 이 수정된 문제는 다음과 같습니다.

개발 환경에서 Python 3.8이 설치된 Mac에서 Poetry를 가상 환경 공급자로 사용하여 https://stackoverflow.com/a/42982144/15484549 이라는 답변을 기반으로 사용하고 자체 서명된 루트 인증서의 내용을 certificacert.pem 파일에 추가했습니다.

세부 단계:

cd project_folder
poetry add requests
# or if you use something else, make sure certifi is among the dependencies
poetry shell
python
>>> import certifi
>>> certifi.where()
/path/to/the/certifi/cacert.pem
>>> exit()
cat /path/to/self-signed-root-cert.pem >> /path/to/the/certifi/cacert.pem
python the_script_you_want_to_run.py

나는 그것이 오래된 실이라는 것을 압니다.하지만 최근에 이 문제를 접하게 되었습니다.내 python 요청 코드는 자체 서명된 인증서를 수락하지 않지만 curl은 수락합니다.Python 요청은 자체 서명된 인증서에 매우 엄격한 것으로 나타났습니다.루트 CA 인증서여야 합니다.다른 말로 하면,

기본 제약 조건: CA:TRUE

키 사용: 디지털 서명, 거부 불가, 키 암호화, 인증서 서명

가 ( Proxy하려고 여기에 한다면, 을 "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "cacerts.txtpython 패키지에 포함된 파일입니다.

예:

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

다른 솔루션에서 참조된 환경 변수는 요청별로 다르며 테스트에서 httplib2에서 선택하지 않았습니다.

시도해 볼 수 있습니다.

settings = s.merge_environment_settings(prepped.url, None, None, None, None)

자세한 내용은 여기에서 확인할 수 있습니다. http://docs.python-requests.org/en/master/user/advanced/

언급URL : https://stackoverflow.com/questions/30405867/how-to-get-python-requests-to-trust-a-self-signed-ssl-certificate

반응형