2017-11-12 4 views
1

다음 주소의 Nav Canada 웹 사이트에서 최신 항공 날씨 데이터를 긁는 스크립트를 만들었습니다.SSL : CERTIFICATE_VERIFY_FAILED Nav Canada 웹 사이트를 열려고 할 때

https://flightplanning.navcanada.ca/cgi-bin/lab/lab.cgi?Langue=anglais&NoSession=NS_Inconnu&TypeBrief=L&Version=T&AerodromeId=CYOW&cw_metar=dcd_metar&fw_gfaCld=on&fw_gfaIcg=on&rwt_uprWindsFD180=on

나는 몇 가지 변수를 계산하고 라즈베리 파이를 사용하여 내 자신의 웹 서버에 표시하려면이 데이터를 사용합니다. 며칠 전 여러 달 동안 아무 문제없이이 오류가 발생했습니다. 다른 웹 사이트로 연결을 전환하여 요청 모듈의 버그인지 확인했지만 다른 웹 사이트는 정상적으로 작동합니다. 이런 식으로 사이트에 액세스하는 것이 어떻게 든 금지 될 수 있습니까? 브라우저를 통해 액세스 할 수 있습니다. 아니면 제가 생각하지 못했던 또 다른 근본적인 문제입니까? 다음은 스택 추적입니다.

Traceback (most recent call last): 
    File "C:\Program Files\Python36\lib\urllib\request.py", line 1318, in do_open 
    encode_chunked=req.has_header('Transfer-encoding')) 
    File "C:\Program Files\Python36\lib\http\client.py", line 1239, in request 
    self._send_request(method, url, body, headers, encode_chunked) 
    File "C:\Program Files\Python36\lib\http\client.py", line 1285, in _send_request 
    self.endheaders(body, encode_chunked=encode_chunked) 
    File "C:\Program Files\Python36\lib\http\client.py", line 1234, in endheaders 
    self._send_output(message_body, encode_chunked=encode_chunked) 
    File "C:\Program Files\Python36\lib\http\client.py", line 1026, in _send_output 
    self.send(msg) 
    File "C:\Program Files\Python36\lib\http\client.py", line 964, in send 
    self.connect() 
    File "C:\Program Files\Python36\lib\http\client.py", line 1400, in connect 
    server_hostname=server_hostname) 
    File "C:\Program Files\Python36\lib\ssl.py", line 401, in wrap_socket 
    _context=self, _session=session) 
    File "C:\Program Files\Python36\lib\ssl.py", line 808, in __init__ 
    self.do_handshake() 
    File "C:\Program Files\Python36\lib\ssl.py", line 1061, in do_handshake 
    self._sslobj.do_handshake() 
    File "C:\Program Files\Python36\lib\ssl.py", line 683, in do_handshake 
    self._sslobj.do_handshake() 
ssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:749) 

During handling of the above exception, another exception occurred: 

Traceback (most recent call last): 
    File "C:/Users/Philip Naida/Google Drive/Projects/WeatherDataCollector/WeatherDataCollector v_5.0/WeatherDataCollector.py", line 15, in <module> 
    source = urllib.request.urlopen('https://flightplanning.navcanada.ca/cgi-bin/CreePage.pl?Langue=anglais&NoSession=NS_Inconnu&Page=forecast-observation&TypeDoc=html').read() 
    File "C:\Program Files\Python36\lib\urllib\request.py", line 223, in urlopen 
    return opener.open(url, data, timeout) 
    File "C:\Program Files\Python36\lib\urllib\request.py", line 526, in open 
    response = self._open(req, data) 
    File "C:\Program Files\Python36\lib\urllib\request.py", line 544, in _open 
    '_open', req) 
    File "C:\Program Files\Python36\lib\urllib\request.py", line 504, in _call_chain 
    result = func(*args) 
    File "C:\Program Files\Python36\lib\urllib\request.py", line 1361, in https_open 
    context=self._context, check_hostname=self._check_hostname) 
    File "C:\Program Files\Python36\lib\urllib\request.py", line 1320, in do_open 
    raise URLError(err) 
urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:749)> 

당신이, 당신의 어떤 URLLIB를 사용하여이 웹 페이지에 액세스하고 무슨 일이 일어 나는지을 시도 할 수 할 수 있다면? 어떤 도움이라도 내 서버를 온라인 상태로 되돌리고 싶습니다.

감사

답변

-1

웹 사이트는 HMAC-SHA1 (사용되지 않는 암호)과 TLS 1.0 (사용되지 않는 프로토콜), RSA (사용되지 않는 키 교환) 및 AES_128_CBC을 사용하고 있습니다. 계속 사용하려면 requests 패키지를 사용하는 것이 좋습니다. 요청을 보낼 때 서버 확인을 끌 수 있습니다.

import requests 

url = ('https://flightplanning.navcanada.ca/cgi-bin/lab/lab.cgi?Langue=anglais' 
     '&NoSession=NS_Inconnu&TypeBrief=L&Version=T&AerodromeId=CYOW&cw_metar=' 
     'dcd_metar&fw_gfaCld=on&fw_gfaIcg=on&rwt_uprWindsFD180=on') 

res = request.get(url, verify=False) 

# you will get the following warning 
InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate 
verification is strongly advised. See: https://urllib3.readthedocs.io 
/en/latest/advanced-usage.html#ssl-warnings InsecureRequestWarning) 

res 
# returns: 
<Response [200]> 
+0

TLS 프로토콜 버전, 키 교환 및 암호는 인증서 유효성 검사와 관련이 없습니다. –

+0

나는 단순히 Google 크롬이보고 한 오류 코드를 복사했습니다. – James

+0

"사용되지 않는 연결 설정"으로 시작하는 Chrome의 개발자 도구에있는 보안 탭에 표시된 * 정보 *를 의미합니까? 이것은 * 오류 코드 *가 아니라 연결 보안의 품질에 대한 정보입니다. 오류가 있거나 수용 할 수없는 취약한 보안이있는 경우 Chrome은 사이트의 콘텐츠를 표시하지 않습니다. 그러나 단순히 인증서 유효성 검사를 건너 뛰는 제안은 사이트의 보안 설정이 아닌 최적의 보안 설정보다 연결 보안을 크게 손상시킵니다. –

0

당신이 다른 많은 경고 중 볼이 사이트의 report from SSLLabs에서 상대 :

이 서버의 인증서 체인이 완전하지 않습니다.

자세한 내용을 보면 서버가 리프 인증서 만 제공하지만 로컬 루트 인증서에 트러스트 체인을 구축하는 데 필요한 중간 인증서를 제공하지 못하고 있음을 알 수 있습니다.

데스크톱 브라우저는 잘못 설정된 서버를 자동으로 다른 곳에서 가져 오려고 시도하므로 종종 그런 것은 아닙니다. 그러나 Python, Perl, Java ... 응용 프로그램과 같은 다른 응용 프로그램은 인증서가 누락 된 중간 인증서없이 제대로 유효성을 검사 할 수 없기 때문에 단순히 실패합니다.

이 서버를 해결하려면 중간 인증서를 직접 제공해야합니다. 이이 같은 요청을 예를 들어 수행 할 수 있습니다

import requests 
response = request.get('https://flightplanning.navcanada.ca', verify='mycerts.pem') 

모든 누락 된 중간 인증서 및 신뢰할 수있는 루트 인증서를 포함 mycerts.pem으로. 이 특정 서버와의 연결을 수정하는 파일을 찾을 수 있습니다. https://pastebin.com/zi5BN2Vt

+0

도움 주셔서 감사합니다! 나는 검증을 건너 뛰고 싶지 않기 때문에 누락 된 인증서를 먼저 얻으려고 노력할 것입니다. 가능한 한 빨리 시도해 볼 수 있습니다. –

+0

그래서이 작업을 시도했지만 제대로 작동하지 않았습니다. 단지 작업을 올바르게하고 싶습니다. urllib.request '를 사용하고 있으므로 다음과 같이'source = urllib.request.urlopen ('https://flightplanning.navcanada.ca ', cafile ='mycerts.pem ', capath ='C : \ Users \ 사용자 \ Google 드라이브 \ 프로젝트 \ WeatherDataCollector \ WeatherDataCollector v_5.0 '). read()'. ''unicodeescape '코덱이 2-3 위치의 바이트를 디코딩 할 수 없다는 오류가 발생했습니다 : 잘린 \ UXXXXXXXX 이스케이프. 각 인증서를 사용하여 시도하고 두 가지 모두 동일한 오류가 발생했습니다. –

+0

@PhilipNaida :이 오류의 출처를 모르지만 인증서 유효성 검사와 관련이 없습니다. 나는 당신이 보여준 코드 라인을 시도했다. (다른 capath와 mycerts.pem을 제공한다.) 나는 문제없이 작동한다. 이것은 정말로 실패하고있는이 선입니까? –

관련 문제