編集:-私のブログで質問と受け入れられた回答をより見やすい方法でフォーマットしようとしました
これが元の問題です。
このエラーが発生しています:
詳細メッセージ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());
domainname
RHELサーバーを適切に設定すると、問題はなくなりました。それが誰かを助けることを願っています。