인증서 확인 실패: 로컬 발급자 인증서를 가져올 수 없습니다.
저는 파이썬을 사용하여 웹에서 데이터를 얻으려고 합니다.urllib.request 패키지를 가져왔는데 실행 중 오류가 발생합니다.
certificate verify failed: unable to get local issuer certificate (_ssl.c:1045)
- Mac OS High Sierra에서 Python 3.7을 사용하고 있습니다.
- 다음에서 CSV 파일을 가져오려고 합니다. https://s3.amazonaws.com/assets.datacamp.com/production/course_1606/datasets/winequality-red.csv
URL을 'http'로 변경했을 때 - 데이터를 얻을 수 있습니다.하지만 SSL 인증서를 확인하는 것은 피할 수 있다고 생각합니다.
그래서 저는 인터넷에서 한 가지 해결책을 찾았습니다.려달을 합니다./Applications/Python\ 3.7/Install\ Certificates.command
이것으로 저의 문제가 해결되었습니다.하지만 저는 SSL 등에 대한 지식이 없습니다.제 문제를 해결하는 데 실제로 어떤 역할을 했는지 이해할 수 있도록 도와주시겠습니까?
가능하다면 보안 및 인증서에 대해 배울 수 있는 좋은 자료를 추천해 주시기 바랍니다.저는 이것이 처음입니다.
감사합니다!
참고: 링크를 통과했습니다. openssl, python 요청 오류: "인증서 확인 실패"
. 제가 할 때 실제로 어떤 일이 때문입니다. 왜냐하면 설치할 때 실제로 어떤 일이 일어나는지 알고 싶기 때문입니다.certifi
또는 장포실Install\ Certificates.command
오류를 수정합니다.저는 증권에 대한 이해가 부족합니다.
아직도 이 문제를 해결하는 방법에 대해 궁금해하는 사람들을 위해, "를 설치함으로써 제 것을 얻었습니다.Install Certificates.command
"
제가 한 일은 이렇습니다.
해당 파일을 두 번 클릭하여 설치할 때까지 기다리십시오. 저의 경우에는 준비가 완료됩니다.
OS 인증서에서 Python으로 심볼 링크를 생성하는 것이 저에게 도움이 되었습니다.
ln -s /etc/ssl/* /Library/Frameworks/Python.framework/Versions/3.9/etc/openssl
는 (MacOS 사고있다습니를하용▁()를 pyenv
)
저는 OSX에서 동일한 문제를 해결했지만 Linux에서는 코드가 완벽했습니다. 그리고 당신은 질문에 대한 답을 제시했습니다!
에 당신이 것은 이지적파검후사한을일한당신후입니다./Applications/Python 3.7/Install Certificates.command
Python 를 Python 설치를 하는 것으로 .certifi
꾸러미
certifi
루트 인증서 집합입니다.는 신뢰합니다. 를 신뢰하기 예를 , SSL 인증 신 서 인 서 를 증 상 즉 위 하 뢰 신 는 인 신 인 하 서 를 각 신 뢰 다 니 합 뢰 를 인 서 특 증정하의 증나기때에문뢰상증는서다위니존인의의합체에▁each ▁you :다즉니합 각 신뢰▁certific ▁ssl , ▁a어느 시점에는 "상위"가 없으며 "루트" 인증서입니다.이러한 경우 일반적으로 신뢰할 수 있는 루트 인증서(일반적으로 "DigiCert"와 같은 대형 신뢰 회사)를 번들로 제공하는 것 외에는 다른 솔루션이 없습니다.
예를 들어 브라우저 보안 설정에서 루트 인증서를 볼 수 있습니다(예: Firefox ->기본 설정 ->개인 정보 및 보안 ->인증서 보기 ->당국).
문제로 , 하기 에..command
파일을 실행하면 새로 설치할 때 빈 목록이 반환됩니다.
import os
import ssl
openssl_dir, openssl_cafile = os.path.split(
ssl.get_default_verify_paths().openssl_cafile)
# no content in this folder
os.listdir(openssl_dir)
# non existent file
print(os.path.exists(os.path.join(openssl_dir, openssl_cafile)))
, 즉, OSX을 Python의 설치에 대한 .은 가한기정에제서기공다본니입에서 입니다.certifi
꾸러미
다음과 같은 .certifi.where()
인증 기관의 위치를 제공합니다.):
import platform
# ...
ssl_context = ssl.SSLContext(ssl.PROTOCOL_TLS)
ssl_context.verify_mode = ssl.CERT_REQUIRED
ssl_context.check_hostname = True
ssl_context.load_default_certs()
if platform.system().lower() == 'darwin':
import certifi
ssl_context.load_verify_locations(
cafile=os.path.relpath(certifi.where()),
capath=None,
cadata=None)
그고요합니다을청리▁to▁an에 요청합니다.url
다음과 같은 파이썬에서:
import urllib
# previous context
https_handler = urllib.request.HTTPSHandler(context=ssl_context)
opener = urllib.request.build_opener(https_handler)
ret = opener.open(url, timeout=2)
이것은 모든 OS에서 작동했습니다.
import ssl
import certifi
from urllib.request import urlopen
request = "https://example.com"
urlopen(request, context=ssl.create_default_context(cafile=certifi.where()))
이 문제가 지속되는 사용자의 경우: - MacOS의 Python 3.6(다른 버전도 마찬가지입니까?)은 OpenSSL의 자체 개인 복사본과 함께 제공됩니다.즉, 시스템의 신뢰 인증서가 Python ssl 모듈에서 더 이상 기본값으로 사용되지 않습니다.이 문제를 해결하려면 시스템에 인증서 패키지를 설치해야 합니다.
두 가지 방법으로 이 작업을 수행할 수 있습니다.
PIP를 통해:
pip install --upgrade certifi
작동하지 않으면 Mac용 Python 3.6에 번들로 제공되는 Cerificates. 명령을 실행해 보십시오.
open /Applications/Python\ 3.6/Install\ Certificates.command
이제 인증서가 설치되어 있어야 하며, Python은 HTTPS를 통해 문제 없이 연결할 수 있어야 합니다.
이것이 도움이 되었기를 바랍니다.
환경: Mac, Python 3.10, iTerm,
- 파일: Certificates명령 Install Certificates.명령어
- 정보 가져오기
- 파일: iTerm으로 .
- 'Install Certificates.command'를 두 번 클릭합니다.
인증서 설치를 기다리는 중입니다.해결하세요.
질문에 [macos] 태그가 없기 때문에 ubuntu 아래에 동일한 문제에 대한 솔루션을 게시합니다.
sudo apt install ca-certificates
sudo update-ca-certificates --fresh
export SSL_CERT_DIR=/etc/ssl/certs
해결책은 Github의 Zomatree에서 나옵니다.
저는 참고 자료를 제공하고 싶습니다.+ 를 사용한 다음 cmd + 사다입고음을 입력합니다.Install Certificates.command
그런 다음 Enter 키를 누릅니다.잠시 후 명령줄 인터페이스가 팝업되어 설치를 시작합니다.
-- removing any existing file or link
-- creating symlink to certifi certificate bundle
-- setting permissions
-- update complete
마지막으로 오류를 수정합니다.
Certifi
에서는 SSL 인증서의 신뢰성을 검증하는 동시에 TLS 호스트의 ID를 확인할 수 있도록 Mozilla의 신중하게 선별된 루트 인증서 모음을 제공합니다.요청 프로젝트에서 추출되었습니다.
pip install certifi
또는 아래 프로그램 코드 실행:
# install_certifi.py
#
# sample script to install or update a set of default Root Certificates
# for the ssl module. Uses the certificates provided by the certifi package:
# https://pypi.python.org/pypi/certifi
import os
import os.path
import ssl
import stat
import subprocess
import sys
STAT_0o775 = ( stat.S_IRUSR | stat.S_IWUSR | stat.S_IXUSR
| stat.S_IRGRP | stat.S_IWGRP | stat.S_IXGRP
| stat.S_IROTH | stat.S_IXOTH )
def main():
openssl_dir, openssl_cafile = os.path.split(
ssl.get_default_verify_paths().openssl_cafile)
print(" -- pip install --upgrade certifi")
subprocess.check_call([sys.executable,
"-E", "-s", "-m", "pip", "install", "--upgrade", "certifi"])
import certifi
# change working directory to the default SSL directory
os.chdir(openssl_dir)
relpath_to_certifi_cafile = os.path.relpath(certifi.where())
print(" -- removing any existing file or link")
try:
os.remove(openssl_cafile)
except FileNotFoundError:
pass
print(" -- creating symlink to certifi certificate bundle")
os.symlink(relpath_to_certifi_cafile, openssl_cafile)
print(" -- setting permissions")
os.chmod(openssl_cafile, STAT_0o775)
print(" -- update complete")
if __name__ == '__main__':
main()
Brew가 Mac용 Python3 번들에 포함된 Install Certificates. 명령을 실행하지 않았습니다.
시작할 때 다음 코드를 붙여넣습니다.
# paste this at the start of code
import ssl
try:
_create_unverified_https_context = ssl._create_unverified_context
except AttributeError:
pass
else:
ssl._create_default_https_context = _create_unverified_https_context
이 오류의 원인은 OPENSSLDIR이 실제 인증서를 포함하지 않는 경로로 설정되었기 때문입니다. 일부 업그레이드/재설치로 인해 발생했을 수 있습니다.
이러한 경우를 확인하려면 다음을 실행해 보십시오.
openssl s_client -CApath /etc/ssl/certs/ -connect some-domain.com:443
을 하면,-CApath /etc/ssl/certs/
그리고 a를 얻습니다.20
오류 코드, 그러면 이것이 가능한 원인입니다.된 값을 .openssl version -a
.
컴파일해야 에 기존 해결책이라는 되었습니다. OPENSSLDIR과 OPENSLDIR, 그리고 OPENSLDIR을 변경하면 됩니다.ln -s /etc/ssl/certs your-openssldir/certs
갑자기 Windows 환경에서 이 문제가 발생하기 시작했습니다.설상가상으로 제가 pip을 실행했을 때도 표시가 되어 있어서 원격 서버 인증서에 문제가 없었습니다.
여러 가지 시도를 해본 결과 여러 답변의 비트와 조각을 결합한 솔루션을 발견했습니다.
pip.ini: pip config set global.pip-host "pypi.org 파일에 신뢰할 수 있는 호스트를 추가합니다.pythonhosted.org 파이피.python.org "(pip 설치 매개 변수로만 전달할 수 없음)
시스템 인증서 업데이트: pip install pip-system-certs(python-certificate-win32 설치가 작동하지 않음)
이제 https 요청이 다시 작동하고 있습니다. \o/
리눅스에서 콘다에 오류가 있었습니다.제 해결책은 간단했습니다.
conda install -c conda-forge certifi
기본 인증서에 문제가 있는 것 같아 콘다포지를 사용해야 했습니다.
주의: 저는 자격증에 대해 잘 알지 못하지만, 이것은 일찍 확인할 가치가 있다고 생각합니다.
코드/패키지/시스템을 재구성하기 전에 다운로드하려는 서버에 문제가 없는지 확인합니다.
"현지 발급자 인증서를 얻을 수 없습니다"라고 하면 현지 기계에 문제가 있는 것처럼 보이기 때문에 오류가 오해의 소지가 있다고 생각합니다. 하지만 반드시 그렇지는 않을 수도 있습니다.
로드하려는 페이지를 다음과 같은 좋은 페이지로 변경해 보십시오.https://www.google.com
문제가 지속되는지 확인합니다.또한 https://www.digicert.com/help/ 에서 검색 도구를 사용하여 문제가 발생한 도메인을 확인하십시오.
제 경우, DigiCert의 도구는 "인증서가 신뢰할 수 있는 기관에 의해 서명되지 않았습니다(모질라의 루트 저장소에 대해 확인)."라고 말했습니다.루트 인증서가 설치되어 있는 것 같으면서도 오류가 발생한 이유를 설명할 수 있습니다.HTTPS로 다른 사이트를 로딩해보니 문제가 없었습니다.
만약 이 경우가 당신에게 적용된다면, 아마도 3가지 논리적 옵션이 있을 것입니다. (우선순위) 1) 서버가 당신의 통제 하에 있다면 수정, 2) HTTPS를 계속 사용하는 동안 인증서 확인을 비활성화, 3) HTTPS를 건너뛰고 HTTP로 이동합니다.
이 페이지는 "인증서 확인 실패: 로컬 발급자 인증서를 가져올 수 없음"에 대한 구글 최고 히트 페이지이므로, 원래 질문에 직접적으로 답하지는 않지만, 아래는 동일한 증상의 문제에 대한 해결책입니다.service.xmlrpc에 이 했습니다.이를 위해서는 상당히 낮은 수준을 사용해야 합니다.ssl.SSLContext
클래스. 이 오류는 인증서가 누락되었음을 나타냅니다.수정 사항은 건설할 때 몇 가지 작업을 수행하는 것이었습니다.SSLContext
객체:
첫째, 클라이언트에서:
def get_client():
context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
# Load the default certs:
context.load_default_certs()
# Optionally, install the intermediate certs.
# This _should_ be handled by the server, but
# maybe helpful in some cases.
# context.load_verify_locations('path/to/ca_bundle.crt')
return xmlrpc.client.ServerProxy('https://server.yourdomain.com/', context=context)
서버에서 다음 컨텍스트에 중간 인증서를 설치해야 합니다.
class SecureXMLRPCServer(socketserver.TCPServer,
xmlrpc.server.SimpleXMLRPCDispatcher):
# https://gist.github.com/monstermunchkin/1100226
allow_reuse_address = True
def __init__(self, addr, certfile, keyfile=None,
ca_bundle=None,
requestHandler=xmlrpc.server.SimpleXMLRPCRequestHandler,
logRequests=True, allow_none=False, encoding=None,
bind_and_activate=True, ssl_version=ssl.PROTOCOL_TLSv1_2):
self.logRequests = logRequests
# create an SSL context
self.context = ssl.SSLContext(ssl_version)
self.context.load_default_certs()
# The server is the correct place to load the intermediate CA certificates:
self.context.load_verify_locations(ca_bundle)
self.context.load_cert_chain(certfile=certfile, keyfile=keyfile)
xmlrpc.server.SimpleXMLRPCDispatcher.__init__(self, allow_none,
encoding)
# call TCPServer constructor
socketserver.TCPServer.__init__(self, addr, requestHandler,
bind_and_activate)
if fcntl is not None and hasattr(fcntl, 'FD_CLOEXEC'):
flags = fcntl.fcntl(self.fileno(), fcntl.F_GETFD)
flags |= fcntl.FD_CLOEXEC
fcntl.fcntl(self.fileno(), fcntl.F_SETFD, flags)
def get_request(self):
newsocket, fromaddr = self.socket.accept()
# create an server-side SSL socket
sslsocket = self.context.wrap_socket(newsocket, server_side=True)
return sslsocket, fromaddr
Windows에서 이를 경험한 후 이 문제로 어려움을 겪은 후 웹 페이지의 SSL 인증서 체인을 다운로드했습니다.
Chrome에서 이를 위한 단계 - (왼쪽 위의 자물쇠 -> "연결이 안전합니다" -> "인증서가 유효합니다"를 누릅니다.)인증서 체인을 보려면 인증 경로를 선택합니다.각 인증서를 다운로드하려면 "인증 경로" 탭에서 인증서를 보고 "상세 정보" 탭을 열고 파일로 복사합니다.
다운로드가 완료되면 인증서를 저장할 위치를 열고 하나의 .PEM 파일로 컴파일합니다.
이를 예로 들 수 있습니다.
openssl x509 -in inputfilename.cer -inform DER -outform PEM >> .pem
이 문제의 순서는 체인에서 가장 낮은 인증서로 시작합니다. 그렇지 않으면 번들이 무효화됩니다.
마침내.
response = requests.get('enter/urll/here', verify ='/path/to/created bundle')
저에게는 제안된 모든 해결책이 효과가 없었습니다.하지만 ZScaler라는 IT 보안 소프트웨어 패키지가 설치되어 있는 회사 PC의 터미널에서 코드를 실행하고 있었습니다.ZScaler 소프트웨어를 비활성화하여 모든 문제를 해결했습니다.
나에게 문제는 내가 설정하는 것이었습니다.REQUESTS_CA_BUNDLE
내 안에서.bash_profile
/Users/westonagreene/.bash_profile:
...
export REQUESTS_CA_BUNDLE=/usr/local/etc/openssl/cert.pem
...
한번 설정하면REQUESTS_CA_BUNDLE
.에서 제거됨).requests
다시 작동했습니다.
export REQUESTS_CA_BUNDLE=""
python python을 실행할 합니다.requests
CLI(명령줄 인터페이스)를 사용합니다.내가 뛰면,requests.get(URL, CERT)
그것은 아주 잘 해결되었습니다.
Mac OS 카탈리나(10.15.6).. 3.6.11의 Pyenv. 수신되는 오류 메시지:[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1056)
이 답변은 다른 곳에서 제공됩니다. https://stackoverflow.com/a/64152045/4420657
실행하기만 하면 됩니다.
pip install --trusted-host=pypi.org --trusted-host=files.pythonhosted.org --user pip-system-certs'
최근에 MongoDB Atlas에 연결하다가 이 문제가 발생했습니다.최신 버전으로 업데이트했습니다.certifi
파이썬 패키지는 이제 작동합니다.
(하드웨어 3.8, 인증서 2020.4.5.1로 업그레이드, 이전 인증서 버전 2019.11.28)
나는 이미 이것을 시도했음에도 불구하고 Python 3.9-10을 사용하여 Ventura에서 이것을 만났습니다.
- 개인 CA 인증서를 /etc/ssl/cert.pem, /etc/ssl/certs/에 추가했습니다.
- 개인 CA 인증서를 인증서별 cert.pem 파일에 추가했습니다.
- 개인 CA 인증서를 키 체인에 '시스템' 버킷에 추가했습니다.
- REQUESTS_CA_BUNDLE=/etc/ssl/cert.pem을 설정합니다.
이렇게 하면 요청이 작동하지만 HTTP Connection 및 urllib3의 유효성 검사에 실패하여 CA 인증서를 추가할 수 있는 위치가 아직 없는 것으로 나타났습니다.
- /usr/local/etc/ca-certificates/cert.pem
제가 brew를 통해 openssl을 설치했기 때문이라고 생각합니다. 그러면 위 파일이 설정되고 /usr/local/etc/openssl@1.1/cert.pem의 심볼 링크가 추가됩니다.
따라서 brew를 통해 openssl을 설치한 후 인증서 유효성 검사에 실패하는 경우 이에 대한 설명일 수 있습니다.
Install Certificates. 명령을 실행할 때 다음 권한 오류가 발생했습니다.
PermissionError: [Errno 13] Permission denied: '../../lib/python3.10/site-packages/certifi/cacert.pem' -> 'cert.pem'
logout
하지만, 저는 이 문제를 추가함으로써 해결합니다.ssl
도움이 되길 바랍니다.
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
언급URL : https://stackoverflow.com/questions/52805115/certificate-verify-failed-unable-to-get-local-issuer-certificate
'programing' 카테고리의 다른 글
강력한 매개 변수를 사용하여 배열을 허용하는 방법 (0) | 2023.05.22 |
---|---|
스크롤 뷰어 마우스 휠이 스크롤되지 않음 (0) | 2023.05.22 |
jQuery UI 변경 이벤트 문제에 대한 날짜 선택기 (0) | 2023.05.22 |
'array_keys()'를 호출하지 않고 array_map()로 1단계 키 액세스 (0) | 2023.05.22 |
PostgreSQL에서 CHARCHAR와 CHARCHAR의 차이점은 무엇입니까? (0) | 2023.05.22 |