編集:-私のブログで質問と受け入れられた回答をより見やすい方法でフォーマットしようとしました
これが元の問題です。
このエラーが発生しています:
詳細メッセージsun.security.validator.ValidatorException:PKIXパスの構築に失敗しました:
sun.security.provider.certpath.SunCertPathBuilderException:要求されたターゲットへの有効な証明書パスが見つかりません原因javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException:PKIXパスの構築に失敗しました:sun.security.provider.certpath.SunCertPathBuilderException:要求されたターゲットへの有効な証明書パスが見つかりません
Tomcat 6をWebサーバーとして使用しています。2つのHTTPS Webアプリケーションが異なるTomcatの異なるポートにインストールされていますが、同じマシン上にあります。言ってやるApp1(port 8443)
とApp2(port 443)
。App1
に接続しApp2
ます。にApp1
接続するApp2
と、上記のエラーが発生します。これは非常に一般的なエラーであるため、さまざまなフォーラムやサイトで多くの解決策を見つけました。私はserver.xml
両方のTomcatの以下のエントリを持っています:
keystoreFile="c:/.keystore"
keystorePass="changeit"
すべてのサイトが、app2によって提供された証明書がapp1 jvmの信頼できるストアにないという同じ理由を述べています。これは、IEブラウザーで同じURLをヒットしようとしたときにも当てはまるようです(ウォーミングして、このWebサイトのセキュリティ証明書に問題があります。ここでは、このWebサイトに進みます)。しかし、同じURLがJavaクライアントによってヒットされると(私の場合)、上記のエラーが発生します。したがって、トラストストアに配置するために、次の3つのオプションを試しました。
オプション1
System.setProperty("javax.net.ssl.trustStore", "C:/.keystore");
System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
Option2環境変数の以下の設定
CATALINA_OPTS -- param name
-Djavax.net.ssl.trustStore=C:\.keystore -Djavax.net.ssl.trustStorePassword=changeit ---param value
Option3環境変数の以下の設定
JAVA_OPTS -- param name
-Djavax.net.ssl.trustStore=C:\.keystore -Djavax.net.ssl.trustStorePassword=changeit ---param value
しかし、何もうまくいきませんでした。
「Apache HttpClientを使用して無効なSSL証明書を処理する方法」で提案されているJavaアプローチを実行すると、最終的に何が機能しますか?Pascal Thiventによって、つまりプログラムInstallCertを実行します。
しかし、このアプローチはdevboxのセットアップには問題ありませんが、実稼働環境では使用できません。
3つのアプローチは、上記の理由を私は疑問に思って私は同じ値を記載している時に仕事をしませんでしたserver.xml
のapp2
設定でトラストストアに、サーバーと同じ値
System.setProperty("javax.net.ssl.trustStore", "C:/.keystore") and System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
でapp1
プログラム。
詳細については、これが私がどのように接続するかです:
URL url = new URL(urlStr);
URLConnection conn = url.openConnection();
if (conn instanceof HttpsURLConnection) {
HttpsURLConnection conn1 = (HttpsURLConnection) url.openConnection();
conn1.setHostnameVerifier(new HostnameVerifier() {
public boolean verify(String hostname, SSLSession session) {
return true;
}
});
reply.load(conn1.getInputStream());
App2の証明書を、使用されているJVMのトラストストアファイルに追加する必要があります%JAVA_HOME%\lib\security\cacerts
。
最初に、次のコマンドを実行して、証明書がトラストストアにすでにあるかどうかを確認できますkeytool -list -keystore "%JAVA_HOME%/jre/lib/security/cacerts"
(パスワードを入力する必要はありません)。
証明書がない場合は、ブラウザーでダウンロードして取得し、次のコマンドでトラストストアに追加できます。
keytool -import -noprompt -trustcacerts -alias <AliasName> -file <certificate> -keystore <KeystoreFile> -storepass <Password>
インポート後、最初のコマンドを再度実行して、証明書が追加されたかどうかを確認できます。
Sun / Oracleの情報はこちらにあります。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加