달나라 노트

Python Basic : SSL: CERTIFICATE_VERIFY_FAILED error 본문

Python/Python Basic

Python Basic : SSL: CERTIFICATE_VERIFY_FAILED error

CosmosProject 2024. 1. 29. 22:24
728x90
반응형

 

 

 

import requests

url = '~~~'
res = requests.get(url=url)

 

Python에서 requests library를 이용해서 외부 API를 이용하던 도중 SSL error가 또 발생했습니다.

위처럼 간단하게 API를 호출하는 코드였는데 말이죠.

 

SSL: CERTIFICATE_VERIFY_FAILED

 

보통 이런 경우는 내가 접근하려는 URL, API 등에서 SSL 인증서가 제대로 확인되지 않을 때 또는 HTTPS request를 할 때 발생합니다.

 

그리고 사용하는 인터넷 환경에서 이러한 인증서 확인을 반드시 실행한다는 옵션이 있거나 하면 접근되지 않는 경우가 더 많을 수 있죠.

 

 

여기서는 제가 시도해봤던 세 가지 방법을 알아보겠습니다.

 

 

 

 

1. cerifi upgrade

 

pip install --upgrade certifi
pip install --upgrade pip

 

위 command를 terminal에 입력하여 certifi를 upgrade해줍시다.

 

ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.
conda-repo-cli 1.0.41 requires requests_mock, which is not installed.
conda-repo-cli 1.0.41 requires clyent==1.2.1, but you have clyent 1.2.2 which is incompatible.
conda-repo-cli 1.0.41 requires nbformat==5.4.0, but you have nbformat 5.7.0 which is incompatible.

이 과정에서 위처럼 requirements가 충족되지 않는 경우는 에러를 보고 추가적으로 설치/업그레이드 해줍니다.

 

 

만약 이 방법으로 해결되면 여기서 끝내면 되지만 저는 이 방법으로 해결되지 않았습니다.

 

 

 

2. Install Certificates.command 실행

 

맥 환경이라면 Command + Space Bar를 눌러서 또는 Python이 설치된 경로로 가서 Install certificates.command 파일을 실행해줍니다.

 

 

 

참고로 Install Certificates.command 파일은 Python이 설치될 때 자동으로 생성되는 파일입니다.

anaconda python만 설치되어있거나 하면 Install Certificates.command 파일이 없을 수 있으니 Python을 설치해주셔야 합니다.

 

 

 

그러면 위같은 내용이 나올텐데 process가 완료되었다는 메세지가 나오면 끝입니다.

 

이제 실행했던 코드를 다시 실행해보면 됩니다.

다들 이 방법으로 해결했다고 하는데 저는 이걸로도 해결되지 않았습니다.

 

 

 

3. request의 verify=False

 

import requests

url = '~~~'
res = requests.get(url=url)

 

제가 사용하던 코드는 위와 같았습니다.

 

import requests

url = '~~~'
res = requests.get(url=url, verify=False)

 

get() method에 verify=False 옵션을 추가해주면 됩니다.

(저는 이 방법으로 해결했습니다.)

 

이 방법은 근본적인 해결은 아니고, 그냥 SSL verification을 하지 않겠다는 것입니다.

따라서 안전한 방법은 아닐 수 있습니다. 즉, 신뢰되는 url에 사용하는걸 권장드립니다.

 

import requests

url = '~~~'
res = requests.get(url=url, verify='/path/certi/test.pem')

 

만약 인증서가 있고 그 경로를 안다면 위처럼 인증서 경로를 적어줄 수 도 있습니다.

 

 

 

 

 

 

 

728x90
반응형
Comments