2012-12-04 14 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'),) 

を上げるFoursquareの推奨Pythonライブラリ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

EDIT 01:

質問が実際に発生した理由は、thisまたはthisです。

EDIT 02:

は、この答えは私が予想よりも多くの人々が訪れてきたかを見て、私はは、証明書の検証を無効にすると役に立つかもしれない時にビットを説明したいと思います。

まず、これらの証明書の仕組みについての明るい背景のビット。上記のリンクにはかなりの情報がありますが、とにかくここにあります。

SSL証明書は、よく知られた(少なくとも、よく知られているブラウザ)Certificate Authorityによって検証される必要があります。これらの証明機関(CA)あなたにもそれにCA情報が含まれている証明書を与える:あなたは通常、大まかに言えば、アイデアがある(... SymantecGoDaddy)これらの権限のいずれかから

を全体の証明書を購入します。あなたのブラウザにはよく知られたCAのリストがあるので、ブラウザが証明書を受け取ったときには、"HmmmMMMmmm .... [ブラウザはここで優雅な顔をします]... [ブラウザがよく知られているCAのリストに移動し、シマンテック社のチェックに行きます]ああ、そうですよ、私はそうです、それはシマンテックが検証したと言います。証明書は良いです!

あなたは、ブラウザでURLで少しロックをクリックすると、その情報を自分で見ることができます。しかし、あなただけのHTTPSをテストしたい場合がある

Chrome certificate information

、およびcommand lineツールを使用して独自の認証局を作成し、その「カスタム」CAを使用して、作成したばかりの「カスタム」証明書に署名します。その場合、あなたのブラウザ(質問ではhttplib2.Http)は信頼できるCAのリストの中にあなたの「カスタム」CAを持っていないので、証明書が無効であると言います。情報はまだ暗号化されていますが、ブラウザがあなたに伝えていることは、あなたが行っていると想定している場所に暗号化されたものを完全に信頼していないということです。例えば

、あなたはあなたのlocalhostFQDNのためのカスタムキーとCAとすべてのマンボジャンボ以下this tutorialのセットを作成し、あなたのCA証明書ファイルが現在のディレクトリに配置されていることとしましょう。あなたは、カスタム証明書とそれ以外のものを使って、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の証明書)を探しに行くためにに語ったので、それが無効で検討します。

enter image description here

また、証明書の有効期限が切れます。 SSL暗号化の内部サイトを使用する会社で働いている可能性があります。それは1年の間大丈夫になり、あなたのブラウザは不平を言う。あなたはセキュリティを担当している人に行き、「おい!ここでこの警告を受けるよ!どうしたの?」そして答えは非常にうまくいくかもしれません「ああ、男の子!!私は証明書を更新するのを忘れていました!それを修正するまでは大丈夫です。(本当の話、私は:-Dを受けた答えでswearwordsがあったが)httplib2の

+3

これは本当に良い考えではありません。検証が失敗する理由を実際に理解する必要があります。検証を無効にすることで、上流のFoursquareサーバーを偽装したいと思っている多くの中間者攻撃を検出する能力を実質的に取り除くことができます。単純な場合でも検出することはできません自己署名証明書を生成しました。 – javanix

+1

備考:証明書検証を無効にするには、 'h = httplib2.Http(disable_ssl_certificate_validation = True)'が必要です。 –

+0

@javanix、それゆえ*もしあなたが得ようとしているサイトが "良い人"であることを知っていれば... * – BorrajaX

10

最近のバージョンでは、独自の証明書ストアにデフォルト設定されています。場合

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

あなたがUbuntuの/ Debianのを使用している場合は、明示的に**私がSSL証明書の検証に失敗したかなり確信している

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