10

今日、私は1つの興味深い問題に直面しました。

私はfoursquareが推奨するPythonライブラリhttplib2raiseを使用しています

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

oauthトークンをリクエストしようとしている間

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

_process_request_with_httplib2 function

なぜこれが起こるのか誰かが知っていますか?

4

3 に答える 3

23

取得しようとしているサイトが「いい人」であることがわかっている場合は、次のように「オープナー」を作成してみてください。

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 証明書は、よく知られている (少なくとも、ブラウザでよく知られている)認証局によって検証される必要があります。通常、証明書全体をそれらの機関 ( SymantecGoDaddy ...)のいずれかから購入します。

大まかに言えば、その考え方は次のとおりです。これらの認証局 (CA) は、CA 情報も含む証明書を提供します。 使いのブラウザーにはよく知られている CA のリストがあるため、ブラウザーが証明書を受け取ると、次のような処理が行われます 。それはシマンテックによって検証されています. 私はその「シマンテック」の男を知っていますか? [ブラウザはよく知られている CA のリストに移動し、シマンテックをチェックします] ああ、そうです! わかりました. わかりました、証明書は良好です!

ブラウザで URL の横にある小さなロックをクリックすると、その情報を自分で確認できます。

Chrome 証明書情報

ただし、HTTPS をテストしたいだけで、いくつかのコマンド ラインツールを使用して独自の認証局を作成し、その「カスタム」CA を使用して生成したばかりの「カスタム」証明書に署名する場合があります。 、 右?その場合、ブラウザ (ちなみに質問ではhttplib2.Http) は、信頼できる CA のリストに「カスタム」CA を含めないため、証明書が無効であると表示されます。情報は引き続き暗号化されて移動しますが、ブラウザが伝えていることは、暗号化されて移動していると想定している場所に移動していることを完全に信頼していないということです。

たとえば、FQDN のこのチュートリアルに従ってカスタム キーと CA のセットとすべてのマンボ ジャンボを作成し、CA 証明書ファイルが現在のディレクトリにあるとします。カスタム証明書などを使用してサーバーを実行することができます。これで、CA 証明書ファイルは現在のディレクトリのファイル内にあります(Python スクリプトが実行されるのと同じディレクトリ内)。次のように使用できます。localhost https://localhost:4443./ca.crthttplib2

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

...そして、警告はもう表示されません。なんで?httplib2に CA の証明書を探しに行くように指示したため./ca.crt)

ただし、Chrome (ブラウザーを引用) はこの CA の証明書を認識していないため、無効であると見なされます。

ここに画像の説明を入力

また、証明書の有効期限が切れます。SSL 暗号化を使用する内部サイトを使用している会社で働いている可能性があります。1 年間は問題なく動作しますが、その後、ブラウザが不平を言い始めます。セキュリティ担当者のところに行って、「ヨ!!ここに警告が表示されました!何が起こっているのですか?」と尋ねます。そして、その答えは、「ああ、証明書を更新するのを忘れていました! 大丈夫です。修正するまで、今から受け入れるだけです。」(本当の話ですが、私が受け取った回答には悪口がありました:-D )

于 2012-12-04T16:48:27.477 に答える
13

httplib2 の最近のバージョンでは、独自の証明書ストアがデフォルトになっています。

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

ubuntu/debian を使用している場合は、次のようにシステム証明書ファイルへのパスを明示的に渡すことができます。

httplib2.HTTPSConnectionWithTimeout(HOST, ca_certs="/etc/ssl/certs/ca-certificates.crt")
于 2014-04-01T10:39:10.790 に答える