본문 바로가기
공부 목록/IT & 프로그래밍

맥북에서 발생하는 파이선 에러 SSL: CERTIFICATE_VERIFY_FAILED

by 독학박사 2023. 5. 26.

목차


     seaborn에서 데이터를 불러오는 코드를 작성하던 중 평소 윈도우에서 잘 발생하지 않는 에러를 만나게 되어 조금 당황했었습니다. 윈도우와 맥북을 오가며 파이썬을 다루고 있는데 환경이 조금 다르다 보니 가끔 이런 에러가 발생하면 어떻게 처리해야 할지 난감할 때가 더러 있습니다. 해당 에러가 발생했을 때 문제를 해결한 과정을 기록해 보려고 합니다.

     

     

    맥북에서 SSL Cert 인증 에러
    맥북에서 SSL Cert 인증 에러

     

    1. SSL: CERTIFICATE_VERIFY_FAILED 에러를 만나다

     보통 sklearn에서 데이터 셋을 불러왔는데 오늘은 seaborn에서도 데이터 셋을 로딩할 수 있다는 정보를 얻고 해당 기능을 코드에 넣어 봤습니다.

     

    import seaborn as sns
    
    # iris 데이터셋 로드
    iris = sns.load_dataset("iris")

     

     위의 코드에서 에러가 발생했다는 마킹 없이 그냥 에러를 발생시키는데 문제가 뭔지 인터넷을 검색해도 잘 나오지 않더군요. 아래는 vscode의 interpreter 창에서 발생된 에러 내용이었습니다.

     

    ---------------------------------------------------------------------------SSLCertVerificationError                  Traceback (most recent call last)File /Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/urllib/request.py:1348, in AbstractHTTPHandler.do_open(self, http_class, req, **http_conn_args)   1347 try:-> 1348     h.request(req.get_method(), req.selector, req.data, headers,   1349               encode_chunked=req.has_header('Transfer-encoding'))   1350 except OSError as err: # timeout error
    File /Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/http/client.py:1282, in HTTPConnection.request(self, method, url, body, headers, encode_chunked)   1281 """Send a complete request to the server."""-> 1282 self._send_request(method, url, body, headers, encode_chunked)
    File /Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/http/client.py:1328, in HTTPConnection._send_request(self, method, url, body, headers, encode_chunked)   1327     body = _encode(body, 'body')-> 1328 self.endheaders(body, encode_chunked=encode_chunked)
    File /Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/http/client.py:1277, in HTTPConnection.endheaders(self, message_body, encode_chunked)   1276     raise CannotSendHeader()-> 1277 self._send_output(message_body, encode_chunked=encode_chunked)
    File /Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/http/client.py:1037, in HTTPConnection._send_output(self, message_body, encode_chunked)   1036 del self._buffer[:]-> 1037 self.send(msg)   1039 if message_body is not None:   1040
    ...
    -> 1351         raise URLError(err)   1352     r = h.getresponse()   1353 except:
    URLError:
    Output is truncated. View as a scrollable element or open in a text editor. Adjust cell output settings...

     

     

    2. 터미널에서 테스트를 해보다

     딱히 어느 부분을 에러 코드로 인식해야 하나 고민하다 터미널에서 확인해 보고자 아래와 같이 코드를 입력했습니다.

     

    %python
    >>>import seaborn as sns
    >>>sns.get_dataset_names()

     

    터미널에서는 조금 다른 에러가 발생했습니다.

     

    Traceback (most recent call last):
      File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/urllib/request.py", line 1348, in do_open
        h.request(req.get_method(), req.selector, req.data, headers,
      File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/http/client.py", line 1282, in request
        self._send_request(method, url, body, headers, encode_chunked)
      File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/http/client.py", line 1328, in _send_request
        self.endheaders(body, encode_chunked=encode_chunked)
      File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/http/client.py", line 1277, in endheaders
        self._send_output(message_body, encode_chunked=encode_chunked)
      File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/http/client.py", line 1037, in _send_output
        self.send(msg)
      File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/http/client.py", line 975, in send
        self.connect()
      File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/http/client.py", line 1454, in connect
        self.sock = self._context.wrap_socket(self.sock,
      File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/ssl.py", line 513, in wrap_socket
        return self.sslsocket_class._create(
      File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/ssl.py", line 1071, in _create
        self.do_handshake()
      File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/ssl.py", line 1342, in do_handshake
        self._sslobj.do_handshake()
    ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:997)
     
    During handling of the above exception, another exception occurred:
     
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/seaborn/utils.py", line 512, in get_dataset_names
        with urlopen(url) as resp:
      File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/urllib/request.py", line 216, in urlopen
        return opener.open(url, data, timeout)
      File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/urllib/request.py", line 519, in open
        response = self._open(req, data)
      File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/urllib/request.py", line 536, in _open
        result = self._call_chain(self.handle_open, protocol, protocol +
      File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/urllib/request.py", line 496, in _call_chain
        result = func(*args)
      File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/urllib/request.py", line 1391, in https_open
        return self.do_open(http.client.HTTPSConnection, req,
      File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/urllib/request.py", line 1351, in do_open
        raise URLError(err)
    urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:997)>

     

     맨 아래줄에 [SSL: CERTIFICATE_VERIFY_FAILED]가 눈에 보여 검색에 들어갔습니다. 인증서 관련 문제로 보여 검색에 들어가 봤습니다.

     

    3. 맥북에서 파이썬 인증

     Finder에서 Python을 찾아보면 그 안에 아래와 같이 보일 겁니다. 아래 하이라이트 되어 있는 파일 'install Certification.command'를 더블클릭하면 터미널이 실행되면서 설치를 진행합니다. 그 이후 인증 관련 에러가 사라집니다.

     

    인증서 설치 파일
    인증서 설치 파일

     

     

    4. 마치며

     파이썬의 라이브러리를 설치하고 실행할 때 발생되는 에러에 대해 단순히 코딩의 실수에서만 나타나는 오류가 아닌 이런 시스템적인 에러를 만나게 되면 난감한 경우가 있습니다. 특히, 윈도우에서는 잘 발생하진 않지만 맥북에서는 이러한 오류가 종종 나타나서 맥북을 사용하는 유저한테는 조금의 불편함이 있을 수 있습니다. 저도 이러한 오류가 발생할 때마다 잘 정리해서 맥북의 사용성을 좀 더 높여보려고 합니다

    댓글