source

SSL: Python3에서 CERTIFICATE_VERIFY_실패

factcode 2023. 5. 4. 20:35
반응형

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 certififiddler를 도 있습니다. 니면브당찰신이스/있아러를열었수고도요닫을세그, 으들냥랜요닫▁or세▁it으.

나는 MacOS에서 이 문제가 있었고, 나는 brew installed python 3 version을 링크하여 해결했습니다.

brew link python3

그 후에는 문제없이 작동했습니다.

언급URL : https://stackoverflow.com/questions/35569042/ssl-certificate-verify-failed-with-python3

반응형