私の会社は独自のPKIを使用しています。コードリポジトリへのアクセスに使用するWebブラウザーに、次のような証明書チェーンが表示されます。
Company Root CA
Company Issuing CA Intranet Server
Certificate to the code repository that I want to access
ただし、Gradleを使用してリポジトリにアクセスしようとすると、
Sun.security.validator.ValidatorException: PKIX path building failed: Sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
エラー。
GradleはJVMを使用します。 「Company Root CA」証明書をエクスポートし、次のコマンドでそれをJVMの証明書ストアに追加しました。
"%Java_HOME%\bin\keytool.exe" -import -alias company_root_cacert -file "C:\path\to\company\root\cacert.cer" -keystore "%Java_HOME%\jre\lib\security\cacerts" -storepass changeit
ただし、これで問題は解決しませんでした。さらに、「Company Issuing CA Intranet Server」証明書をエクスポートし、次のコマンドを使用してそれをJVMの証明書ストアに追加しました。
"%Java_HOME%\bin\keytool.exe" -import -alias company_intermediate_cacert -file "C:\path\to\company\intermediate\cacert.cer" -keystore "%Java_HOME%\jre\lib\security\cacerts" -storepass changeit
これで問題は解決しました。
私の質問は、なぜ第2ステップが必要だったのですか? 「会社発行CAイントラネットサーバー」は「会社ルートCA」によって署名されており、JVMが信頼する証明書のリストに「会社ルートCA」があるため、「会社発行CAイントラネットサーバー」を追加する必要があるのはなぜですか。 "JVMの証明書ストアへの証明書?
説明する問題は通常、サーバーがそのリーフ証明書のみを送信し、信頼チェーンを構築するために必要なすべてのチェーン証明書をルートCAに追加しない場合に発生します。残念ながら、これはサーバーの一般的な設定ミスです。
多くのデスクトップブラウザーは、以前のアクセスで不足しているチェーン証明書を既に知っている場合、またはリーフ証明書に機関情報アクセスのCA発行者のURLが含まれている場合、不足している証明書をダウンロードする場合に、この問題を回避します。ただし、この動作は通常、デスクトップブラウザーに制限されており、信頼チェーンを構築できないため、他のツールは単に失敗します。
Oracle JREは中間証明書を自動的にダウンロードできます。
Authority Information Access(AIA)Extensionのサポート
Authority Information Access拡張機能のcaIssuersアクセス方法のサポートが利用可能です。互換性のためにデフォルトでは無効になっており、システムプロパティ
com.Sun.security.enableAIAcaIssuers
を値true
に設定することで有効にできます。Trueに設定されている場合、Sunの
CertPathBuilder
のPKIX実装は、証明書のAIA拡張機能の情報(指定されたCertStores
に加えて)を使用して、発行CA証明書を検索します。 ldap、http、またはftpと入力します。注:ネットワークとファイアウォールの設定によっては、 で説明されているようにネットワークプロキシサーバーも構成する必要がある場合がありますネットワーキングのドキュメント 。