1. ホーム

[解決済み】Javaクライアントでサーバーの自己署名入りssl証明書を受け入れる。

2022-04-02 18:25:54

質問

標準的な問題のようですが、明確な指示がどこにも見当たりません。

私は、おそらく自己署名された(または期限切れの)証明書を持つサーバーに接続しようとするJavaコードを持っています。コードは次のエラーを報告します。

[HttpMethodDirector] I/O exception (javax.net.ssl.SSLHandshakeException) caught 
when processing request: sun.security.validator.ValidatorException: PKIX path 
building failed: sun.security.provider.certpath.SunCertPathBuilderException: 
unable to find valid certification path to requested target

私の理解では キーツール で、javaにこの接続を許可していいと伝えてください。

この問題を解決するためのすべての指示は、私がkeytoolを完全に使いこなしていることを前提としています。

サーバ用の秘密鍵を生成し、鍵ストアにインポートする。

どなたか詳しい説明を載せてくださる方はいらっしゃいませんか?

unixを使用しているので、bashスクリプトがベストです。

重要かどうかわかりませんが、jbossで実行されるコード。

解決方法は?

自己署名証明書をJVMのトラストストアに追加するか、クライアントを以下のように設定します。

オプション1

ブラウザから証明書をエクスポートし、JVMのトラストストアにインポートします(信頼の連鎖を確立するため)。

<JAVA_HOME>\bin\keytool -import -v -trustcacerts
-alias server-alias -file server.cer
-keystore cacerts.jks -keypass changeit
-storepass changeit 

オプション2

証明書の検証を無効にする。

// Create a trust manager that does not validate certificate chains
TrustManager[] trustAllCerts = new TrustManager[] { 
    new X509TrustManager() {     
        public java.security.cert.X509Certificate[] getAcceptedIssuers() { 
            return new X509Certificate[0];
        } 
        public void checkClientTrusted( 
            java.security.cert.X509Certificate[] certs, String authType) {
            } 
        public void checkServerTrusted( 
            java.security.cert.X509Certificate[] certs, String authType) {
        }
    } 
}; 

// Install the all-trusting trust manager
try {
    SSLContext sc = SSLContext.getInstance("SSL"); 
    sc.init(null, trustAllCerts, new java.security.SecureRandom()); 
    HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
} catch (GeneralSecurityException e) {
} 
// Now you can access an https URL without having the certificate in the truststore
try { 
    URL url = new URL("https://hostname/index.html"); 
} catch (MalformedURLException e) {
} 

注意点 オプション②は全くお勧めしません。 . トラストマネージャーを無効にすると、SSLのいくつかの部分が破壊され、中間者攻撃に対して脆弱になります。オプション#1を選ぶか、さらに良い方法は、サーバーによく知られたCAによって署名された"real"証明書を使用させることです。