SSL: Python3에서 CERTIFICATE_VERIFY_실패
바보 같은 질문이라면 죄송합니다만, 저는 몇 가지 프로젝트를 만들 수 있도록 BeautifulSoup을 사용하는 방법을 독학하려고 노력해 왔습니다.
저는 이 링크를 튜토리얼로 팔로우하고 있었습니다. https://www.youtube.com/watch?v=5GzVNi0oTxQ
그와 정확히 같은 코드를 따르면 다음과 같은 오류가 발생합니다.
Traceback (most recent call last):
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/urllib/request.py", line 1240, in do_open
h.request(req.get_method(), req.selector, req.data, headers)
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/http/client.py", line 1083, in request
self._send_request(method, url, body, headers)
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/http/client.py", line 1128, in _send_request
self.endheaders(body)
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/http/client.py", line 1079, in endheaders
self._send_output(message_body)
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/http/client.py", line 911, in _send_output
self.send(msg)
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/http/client.py", line 854, in send
self.connect()
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/http/client.py", line 1237, in connect
server_hostname=server_hostname)
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/ssl.py", line 376, in wrap_socket
_context=self)
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/ssl.py", line 747, in __init__
self.do_handshake()
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/ssl.py", line 983, in do_handshake
self._sslobj.do_handshake()
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/ssl.py", line 628, in do_handshake
self._sslobj.do_handshake()
ssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:645)
위 예외를 처리하는 동안 다른 예외가 발생했습니다.
Traceback (most recent call last):
File "WorldCup.py", line 3, in <module>
x = urllib.request.urlopen('https://www.google.com')
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/urllib/request.py", line 162, in urlopen
return opener.open(url, data, timeout)
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/urllib/request.py", line 465, in open
response = self._open(req, data)
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/urllib/request.py", line 483, in _open
'_open', req)
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/urllib/request.py", line 443, in _call_chain
result = func(*args)
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/urllib/request.py", line 1283, in https_open
context=self._context, check_hostname=self._check_hostname)
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/urllib/request.py", line 1242, in do_open
raise URLError(err)
urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:645)>
누가 이것을 고치는 방법을 찾는 것을 도와줄 수 있나요?
제 경우에는, 저는ssl
모듈은 다음과 같이 인증을 "해결"합니다.
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
그런 다음 링크 내용을 읽으려면 다음을 사용합니다.
urllib.request.urlopen(urllink)
Python이 설치된 폴더로 이동합니다. 예를 들어, 내 경우(Mac OS)는 Applications 폴더에 'Python 3.6' 폴더 이름으로 설치되어 있습니다.이제 'Install Certificates.command'를 두 번 클릭합니다.더 이상 이 오류가 발생하지 않습니다.
Mac을 실행하지 않거나 다른 설정을 사용하여 이 파일을 찾을 수 없는 경우 파일은 다음과 같이 실행됩니다.
pip install --upgrade certifi
데비안 9에서 저는 다음을 해야 했습니다.
$ sudo update-ca-certificates --fresh
$ export SSL_CERT_DIR=/etc/ssl/certs
이유는 모르겠지만, 이 환경 변수는 설정된 적이 없습니다.
최근 버전의 ssl 라이브러리에서 변경되었습니다.SSL 컨텍스트가 자체 속성으로 이동되었습니다.이것은 Python 3.8에서 Jia의 답변과 같습니다.
import ssl
ssl.SSLContext.verify_mode = ssl.VerifyMode.CERT_OPTIONAL
2021년 말 델트리의 2018년 답변 업데이트를 기반으로 다음과 같은 기능을 달성할 수 있었습니다.
import urllib.request
import ssl
def urllib_get_2018():
# Using a protected member like this is not any more fragile
# than extending the class and using it. I would use it.
url = 'https://localhost:6667/my-endpoint'
ssl._create_default_https_context = ssl._create_unverified_context
with urllib.request.urlopen(url = url) as f:
print(f.read().decode('utf-8'))
def urllib_get_2022():
# Finally! Able to use the publice API. Happy happy!
url = 'https://localhost:6667/my-endpoint'
scontext = ssl.SSLContext(ssl.PROTOCOL_TLS)
scontext.verify_mode = ssl.VerifyMode.CERT_NONE
with urllib.request.urlopen(url = url, context=scontext) as f:
print(f.read().decode('utf-8'))
사용해야 했습니다.CERT_NONE
대신에CERT_OPTIONAL
생성뿐만 아니라ssl.SSLContext(ssl.PROTOCOL_TLS)
에게 전해지다urlopen
.
계속 사용하는 것이 중요합니다.urllib
작은 컨테이너 이미지로 작업할 때 의미가 있으므로,pip
아직 설치되지 않았을 수 있습니다.
해결 방법으로 PYONHTPSVERIF 환경 변수를 0으로 설정하여 인증서 확인을 해제할 수 있습니다(보안되지 않음).
export PYTHONHTTPSVERIFY=0
자체 서명된 certllib3 버전 1.25.3을 사용하는 경우 SSL 인증서 무시를 거부합니다.
수정하려면 urllib3-1.25.3을 제거하고 urllib3-1.24.3을 설치합니다.
pip3 uninstall urllib3
pip3 install urllib3==1.24.3
Linux MacOS 및 Window에서 테스트됨
나는 lib what https://requests.readthedocs.io/en/master/ what https://pypi.org/project/certifi/ what ▁use 을 사용하지만 나는 사용자 정의 CA를 포함하고 있습니다./etc/ssl/certs
.
그래서 저는 제 문제를 다음과 같이 해결했습니다.
# Your TLS certificates directory (Debian like)
export SSL_CERT_DIR=/etc/ssl/certs
# CA bundle PATH (Debian like again)
export CA_BUNDLE_PATH="${SSL_CERT_DIR}/ca-certificates.crt"
# If you have a virtualenv:
. ./.venv/bin/activate
# Get the current certifi CA bundle
CERTFI_PATH=`python -c 'import certifi; print(certifi.where())'`
test -L $CERTFI_PATH || rm $CERTFI_PATH
test -L $CERTFI_PATH || ln -s $CA_BUNDLE_PATH $CERTFI_PATH
에트볼랴!
Ubuntu 20.4와 같은 문제에 직면했고 많은 솔루션을 시도했지만 아무 것도 해결되지 않았습니다.마지막으로 방금 openssl 버전을 확인했습니다.업데이트 및 업그레이드 후에도 openssl 버전은 OpenSSL 1.1.1h를 표시했습니다 [2020년 9월 22일].그러나 코드가 문제 없이 작동하는 내 윈도우 시스템에서 openssl 버전은 2021년 3월 25일 OpenSSL 1.1.1k입니다.
openssl을 수동으로 업데이트하기로 결정했고 작동했습니다!감사합니다!!!
단계는 다음과 같습니다(Ubuntu 20.4).
*openssl 버전 확인하기
openssl version -a
*openssl을 업데이트하려면:
sudo apt install build-essential checkinstall zlib1g-dev
cd /usr/local/src/
sudo wget https://www.openssl.org/source/openssl-1.1.1k.tar.gz
sudo tar -xf openssl-1.1.1k.tar.gz
cd openssl-1.1.1k
sudo ./config --prefix=/usr/local/ssl --openssldir=/usr/local/ssl shared zlib
sudo make
sudo make test
sudo make install
cd /etc/ld.so.conf.d/
sudo nano openssl-1.1.1k.conf
* /usr/local/ssl/lib를 입력하고 저장합니다.
sudo ldconfig -v
sudo nano /etc/environment
*경로에 ':/usr/local/ssl/bin' 추가
source /etc/environment
echo $PATH
*이제 openssl 버전 확인
openssl version -a
할 수 .pip install --upgrade certifi
fiddler를 도 있습니다. 니면브당찰신이스/있아러를열었수고도요닫을세그, 으들냥랜요닫▁or세▁it으.
나는 MacOS에서 이 문제가 있었고, 나는 brew installed python 3 version을 링크하여 해결했습니다.
brew link python3
그 후에는 문제없이 작동했습니다.
언급URL : https://stackoverflow.com/questions/35569042/ssl-certificate-verify-failed-with-python3
'source' 카테고리의 다른 글
.axd 파일이란 무엇입니까? (0) | 2023.05.04 |
---|---|
'Microsoft' 유형에 대한 서비스를 확인할 수 없습니다.AsNetCore.신원.'AuthController'를 활성화하는 동안 'UserManager'가 발생했습니다. (0) | 2023.05.04 |
상위 1개 필드를 선택하고 로컬 변수에 할당 (0) | 2023.05.04 |
mongodb 커서 ID가 유효하지 않은 오류입니다. (0) | 2023.04.29 |
SQL Server에서 중위수 계산 기능 (0) | 2023.04.29 |