2012-12-04 4 views
10

오늘 저는 한 가지 흥미로운 문제에 직면했습니다. 이런 이유를 아는 사람 않습니다Httplib2 ssl 오류

_process_request_with_httplib2 function 

에 토큰 OAuth를

response, body = h.request(url, method, headers=headers, body=data) 

를 요청하는 동안 내가

SSLHandshakeError(SSLError(1, '_ssl.c:504: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed'),) 

을 인상 정사각형 추천 파이썬 라이브러리 httplib2를 사용하고

?

+3

같은 시스템 인증서 파일의 경로를 전달할 수 있습니다 ** : - D ** – BorrajaX

답변

20

당신은 당신이 얻을하려는 사이트가 "좋은 사람"이처럼 "오프너"를 만드는 시도 할 수 있음을 알고있는 경우 :

import httplib2 
if __name__ == "__main__": 
    h = httplib2.Http(".cache", disable_ssl_certificate_validation=True) 
    resp, content = h.request("https://site/whose/certificate/is/bad/", "GET") 

(흥미로운 부분은 disable_ssl_certificate_validation=True이다가) 워드 프로세서

: http://bitworking.org/projects/httplib2/doc/html/libhttplib2.html#httplib2.Http

편집 01 :

귀하의 질문이 실제로 이러한 일이 발생했기 때문에 this 또는 this을 확인할 수 있습니다.

편집 02 :

이 답변은 내가 예상했던 것보다 더 많은 사람들이 방문하고있다 방법을보고, 나는 해제 인증서 유효성 검사가 유용 할 수있을 때 조금 을 설명하고 싶습니다.

먼저이 인증서의 작동 방식에 대한 약간의 배경 지식. 위에 제공된 링크에는 꽤 많은 정보가 있지만 여기서는 간과하겠습니다.

SSL 인증서는 잘 알려진 (적어도 브라우저에 잘 알려져 있음) Certificate Authority으로 인증해야합니다. 당신은 일반적으로 (... Symantec, GoDaddy) 이들 기관 중 하나에서

대체적를 전체 인증서를 구입 생각입니다 : 그 인증 기관 (CA)이 당신에게 또한에 CA 정보이 포함 된 인증서를 제공 . 브라우저에는 잘 알려진 CA의 목록이 있으므로 브라우저가 인증서를 받으면 "HmmmMMMmmm .... [브라우저가 여기에서 우세한 얼굴을 만듭니다]... "시만텍"이라는 사람을 알고 있습니까? [브라우저가 잘 알려진 CA의 목록으로 이동하여 시만텍을 확인]오, 예! 알겠습니다. 인증서가 좋다!

당신이 당신의 브라우저에서 URL에 의해 작은 자물쇠를 클릭하면 해당 정보를 직접 볼 수

: Chrome certificate information

그러나, 당신은 단지 HTTPS를 테스트하려는 경우가

하고, 두 개의 command line 도구를 사용하여 자체 인증 기관을 만들고 "사용자 정의"CA를 사용하여 방금 생성 한 "사용자 정의"인증서에 서명하십시오. 이 경우 브라우저 (질문에 따라 httplib2.Http)가 신뢰할 수있는 CA 목록에 "사용자 지정"CA를 가지고 있지 않으므로 인증서가 유효하지 않다고 말할 것입니다. 정보는 여전히 암호화되어 여행 할 것이지만, 브라우저가 말하는 것은 암호화 된 곳으로 이동하는 것을 완전히 신뢰하지 않는다는 것입니다.

예를 들어, 당신이 당신의 localhostFQDN과 당신의 CA 인증서 파일이 현재 디렉토리에 있는지 사용자 지정 키와 CA와 모든 맘보 점보는 this tutorial을 다음의 세트를 만들어 가정 해 봅시다. 사용자 정의 인증서 및 기타 등을 사용하여 서버를 https://localhost:4443에서 실행할 수 있습니다. 이제 CA 인증서 파일은 현재 디렉토리에있는 ./ca.crt 파일 (Python 스크립트가 실행될 디렉토리)에 있습니다. 다음과 같이 을 사용할 수 있습니다.

h = httplib2.Http(ca_certs='./ca.crt') 
response, body = h.request('https://localhost:4443') 
print(response) 
print(body) 

... 더 이상 경고가 표시되지 않습니다. 왜? 당신은 크롬 (브라우저를 인용하기)이 CA의 인증서에 대해 알고하지 않기 때문에

그러나 ./ca.crt에 CA의 인증서)를 찾아 가서 httplib2 말했다 때문에, 그것은 잘못된 생각됩니다

enter image description here

또한 인증서가 만료됩니다. SSL 암호화를 사용하는 내부 사이트를 사용하는 회사에서 일할 기회가 있습니다. 1 년 동안 괜찮 으면 브라우저가 불평하기 시작합니다. 너는 보안 책임자에게 가서 에게 물어 보라. "이 경고가 나왔다. 무슨 일 이니?" 그 대답은 매우 잘 어울릴 수 있습니다 "Oh boy !! 나는 인증서를 갱신하는 것을 잊어 버렸습니다. 괜찮습니다. 고칠 때까지 지금부터 받아 들여야합니다." 자신의 인증서 저장소에 디폴트되는 httplib2의

+3

이것은 실제로 좋은 생각이 아닙니다. 검증이 실패하는 이유를 실제로 알아 내야합니다. 유효성 검사를 비활성화하면 본질적으로 다른 사람이 업스트림 Foursquare 서버를 가장하고 싶어하는 중개자 (man-in-the-middle-attack)를 탐지하는 기능이 제거되므로 간단한 경우에도 탐지 할 수 없습니다 자체 서명 된 인증서를 생성했습니다. – javanix

+1

참고 : 인증서 유효성 검사를 사용하지 않으려면 단지'h = httplib2.Http (disable_ssl_certificate_validation = True)'가 필요합니다. –

+0

@javanix, 그러므로 * 당신이 얻으려고하는 사이트가 "좋은 사람"이라는 것을 알고 있다면 ... * – BorrajaX

10

최신 버전 (이 질문에 욕설이 있었지만 실화, 나는 - D을 받았다). 경우

# Default CA certificates file bundled with httplib2. 
CA_CERTS = os.path.join(
    os.path.dirname(os.path.abspath(__file__)), "cacerts.txt") 

당신은/데비안 우분투를 사용하는 경우, 당신은 명시 적으로 내가 SSL 인증서 확인에 실패 확신

httplib2.HTTPSConnectionWithTimeout(HOST, ca_certs="/etc/ssl/certs/ca-certificates.crt")