[python] SSLError를 던지는 Python 요청

CAS, jspring 보안 검사, 리디렉션 등을 포함하는 간단한 스크립트를 작성하고 있습니다. Kenneth Reitz의 python 요청은 큰 작업이므로 사용하고 싶습니다! 그러나 CAS는 SSL을 통해 유효성을 검사해야하므로 해당 단계를 먼저 거쳐야합니다. 파이썬 요청이 무엇을 원하는지 모르겠습니까? 이 SSL 인증서는 어디에 있어야합니까?

Traceback (most recent call last):
  File "./test.py", line 24, in <module>
  response = requests.get(url1, headers=headers)
  File "build/bdist.linux-x86_64/egg/requests/api.py", line 52, in get
  File "build/bdist.linux-x86_64/egg/requests/api.py", line 40, in request
  File "build/bdist.linux-x86_64/egg/requests/sessions.py", line 209, in request 
  File "build/bdist.linux-x86_64/egg/requests/models.py", line 624, in send
  File "build/bdist.linux-x86_64/egg/requests/models.py", line 300, in _build_response
  File "build/bdist.linux-x86_64/egg/requests/models.py", line 611, in send
requests.exceptions.SSLError: [Errno 1] _ssl.c:503: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed



답변

신뢰할 수없는 SSL 인증서로 인해 발생한 문제입니다.

이전 의견에서 언급 한 @dirk와 마찬가지로 가장 빠른 수정은 설정입니다 verify=False.

requests.get('https://example.com', verify=False)

이로 인해 인증서가 확인되지 않습니다. 이렇게하면 중간자 공격과 같은 보안 위험에 응용 프로그램이 노출됩니다.

물론 판단을 적용하십시오. 의견에서 언급했듯이, 이것은 빠른 / throwaway 응용 프로그램 / 스크립트에는 적합 있지만 실제로는 프로덕션 소프트웨어로 가면 안됩니다 .

특정 상황에서 인증서 검사를 건너 뛸 수없는 경우 다음 옵션을 고려하십시오. 가장 좋은 옵션은 verify매개 변수를 .pem인증서 파일의 경로 인 문자열 로 설정하는 것입니다. 방법).

따라서 버전 2.0부터 verify매개 변수는 각각의 의미와 함께 다음 값을 승인합니다.

  • True: 라이브러리 자체의 신뢰할 수있는 인증 기관에 대해 인증서의 유효성을 검사합니다 (참고 : Requests : Certifi-Trust Database for Humans 에서 추출한 RC의 트러스트 데이터베이스 인 Certifi 라이브러리를 통해 어떤 루트 인증서 요청이 사용하는지 확인할 수 있습니다 ).
  • False: 인증서 유효성 검사를 완전히 무시합니다 .
  • 요청이 인증서를 검증하는 데 사용할 CA_BUNDLE 파일의 경로입니다.

출처 : 요청-SSL 인증서 확인

또한 cert동일한 링크 의 매개 변수를 살펴보십시오 .


답변

SSL 확인에 대한 요청 문서에서 :

요청은 웹 브라우저와 마찬가지로 HTTPS 요청에 대한 SSL 인증서를 확인할 수 있습니다. 호스트의 SSL 인증서를 확인하려면 verify 인수를 사용할 수 있습니다.

>>> requests.get('https://kennethreitz.com', verify=True)

SSL 인증서를 확인하지 않으려면 verify=False


답변

사용할 CA 파일 이름은 verify다음을 통해 전달할 수 있습니다 .

cafile = 'cacert.pem' # http://curl.haxx.se/ca/cacert.pem
r = requests.get(url, verify=cafile)

verify=True그런 다음 requests사용하는 경우 서버 인증서에 서명 한 CA가없는 자체 CA 세트 를 사용하십시오.


답변

$ pip install -U requests[security]

  • Python 2.7.6 @ Ubuntu 14.04.4 LTS에서 테스트
  • MacOSX 10.9.5 @ Python 2.7.5에서 테스트 (매버릭스)

이 질문이 열렸을 때 (2012-05) 요청 버전은 0.13.1입니다. 버전 2.4.1 (2014-09) 에서 “보안”추가 기능이 사용 certifi가능한 경우 패키지를 사용하여 도입되었습니다 .

지금 (2016-09)의 주요 버전은 좋은 작품을, 2.11.1입니다 없이 verify=False . 엑스트라 requests.get(url, verify=False)가 설치된 requests[security]경우을 사용할 필요가 없습니다 .


답변

boto3 코드를 검토하여 aws boto3을 사용할 때 동일한 문제가 발생하고 SSL 인증서 확인 실패 문제 REQUESTS_CA_BUNDLE가 설정되지 않았으므로 수동으로 설정하여 두 문제를 해결했습니다.

from boto3.session import Session
import os

# debian
os.environ['REQUESTS_CA_BUNDLE'] = os.path.join(
    '/etc/ssl/certs/',
    'ca-certificates.crt')
# centos
#   'ca-bundle.crt')

aws-cli의 경우 REQUESTS_CA_BUNDLE을 설정 ~/.bashrc하면이 문제가 해결됩니다 (aws-cli가 작동하지 않으므로 테스트되지 않음).

REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt # ca-bundle.crt
export REQUESTS_CA_BUNDLE


답변

의존하는 라이브러리가 requests있고로 확인 경로를 수정할 수없는 경우 (와 같이 pyvmomi) cacert.pem요청과 함께 번들 을 찾아 CA를 추가해야합니다. cacert.pem위치 를 찾는 일반적인 방법은 다음과 같습니다 .

창문

C:\>python -c "import requests; print requests.certs.where()"
c:\Python27\lib\site-packages\requests-2.8.1-py2.7.egg\requests\cacert.pem

리눅스

#  (py2.7.5,requests 2.7.0, verify not enforced)
root@host:~/# python -c "import requests; print requests.certs.where()"
/usr/lib/python2.7/dist-packages/certifi/cacert.pem

#  (py2.7.10, verify enforced)
root@host:~/# python -c "import requests; print requests.certs.where()"
/usr/local/lib/python2.7/dist-packages/requests/cacert.pem

btw. @ requests-devs, 요청과 함께 자신의 cacerts를 번들로 묶는 것은 정말 성가신 일입니다. 특히 시스템 ca 저장소를 먼저 사용하지 않는 것으로 보이며 이것은 어디에도 문서화되어 있지 않습니다.

최신 정보

라이브러리를 사용하고 ca 번들 위치를 제어 할 수없는 경우 ca 번들 위치를 호스트 전체 ca 번들로 명시 적으로 설정할 수도 있습니다.

REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-bundle.crt python -c "import requests; requests.get('https://somesite.com';)"


답변

나는 gspread를 사용하여 같은 문제에 직면하고 있으며 이러한 명령은 저에게 효과적입니다.

sudo pip uninstall -y certifi
sudo pip install certifi==2015.04.28