일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- Google Spreadsheet
- Java
- math
- Python
- Redshift
- numpy
- PANDAS
- c#
- PostgreSQL
- Apache
- PySpark
- 파이썬
- google apps script
- Tkinter
- matplotlib
- gas
- Kotlin
- Github
- SQL
- django
- Excel
- list
- dataframe
- hive
- GIT
- array
- string
- Google Excel
- Mac
- Today
- Total
달나라 노트
Python Basic : SSL: CERTIFICATE_VERIFY_FAILED error 본문
Python Basic : SSL: CERTIFICATE_VERIFY_FAILED error
CosmosProject 2024. 1. 29. 22:24
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')
만약 인증서가 있고 그 경로를 안다면 위처럼 인증서 경로를 적어줄 수 도 있습니다.