httpエージェントによるunable to find valid certification path to requested targetの問題の解決


1.知識予備
本文を理解するには、以下の知識を身につける必要があります.
  • httpsの基本原理は、証明書の配布や鍵の交渉などを含む[1].
  • httpエージェントとhttpsエージェントの基本原理[2].
  • でよく使われるローカルhttpエージェントツール、例えばFiddler、BurpSuite;
  • Java言語、HttpClientの基本機能とAPIを知る[3].

  • 2.問題の説明と分析
    httpclientライタを使用してhttpsページにアクセスするには、Javaプログラム(httpclientベース)エージェントツール(Fiddlerなど)WebサーバがJavaプログラムを実行すると、プログラムに異常が発生します.ヒント:
    javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    エラー・プロンプトから、Webサイトの証明書を検証できず、証明書検証チェーンが見つかりません.問題を解決するために、エージェントツールで生成された証明書を信頼できるルート証明書としてシステム証明書ライブラリにインポートしますが、問題は依然として発生します.資料[1]を読んだ後、Javaの証明書検証システムはオペレーティングシステムやブラウザとは独立しており、JREの証明書ライブラリを使用しており、エージェントツールを必要とするすべての証明書をJREの証明書ライブラリに追加していることに気づいた.
    3.問題解決
    Windowsシステムでは、JRE証明書ライブラリはProgram FilesJavajdk 1.xjrelibsecuritycacertsとして機能します.JavaはKeytool管理証明書を使用し、そのパスはProgram FilesJavajdk 1.8.0_144\bin\keytool.exe.したがって、keytoolを使用してエージェントツールの証明書をcacertsに追加する必要があります.[2]上記の過程について詳細な原理解釈がある.コマンドラインを開き、Step 1.cdからkeytool.exeのディレクトリに移動します.Step 2.次のコマンドを実行する(コマンドパラメータ説明はkeytoolヘルプファイル参照)
    >keytool -import -alias FIDDLER -keystore ../lib/security/cacerts -file         \     

    パスワードの入力を求める場合、javaのデフォルトパスワードはchangeitで、最後にyを入力して証明書を信頼します.Step 3.証明書が信頼できるルート証明書ライブラリにインポートされたことを確認する
    keytool -list -keystore ../lib/security/cacerts

    参考資料
    [1]JavaとHTTPのこと(四)HTTPSと証明書[2]httpsエージェント原理[3]HttpClient 4.5