0

自己署名証明書を受け入れる必要がある jax-ws クライアント アプリを作成しています。しかし、自己署名証明書をインポートしようとすると、この一般的なSSL ハンドシェイク例外の問題が発生します。そのため、最も一般的な回避策は、JSSE セキュリティ プロバイダを拡張し、SSL コンテキストを初期化して、次のようなすべての証明書を受け入れることです。

Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
TrustManager[] trustCerts = new TrustManager[]{new X509TrustManager() {
                        public X509Certificate[] getAcceptedIssuers() {
                            return null;
                        }

                       public void checkServerTrusted(X509Certificate[]
                       certs, String authType) throws CertificateException {
                            return;
                        }

                        public void checkClientTrusted(X509Certificate[]
                        certs, String authType) throws CertificateException {
                            return;
                        }
                    }
            }; 
SSLContext sc = SSLContext.getInstance("SSLv3");
sc.init(null, trustCerts, null);
SocketFactory factory = sc.getSocketFactory();
SSLSocket socket;
socket = (SSLSocket) factory.createSocket(mInstance.getHostName(),getSecureConnectionEndpoint().getPort());
socket.startHandshake();
setCerts(socket.getSession().getPeerCertificates());

これが、この問題に対して私が見つけた唯一の回避策でした。ここには、 SSL 証明書のインポートなど、同様の種類の質問が多数あり、それらはすべて同じ解決策を提案しています。

これは明らかに中間者攻撃を非常に受けやすく、このソリューションはテスト目的でのみ正当であるように思われます。

私の質問は、証明書をプログラムでインポートしようとするときに、このプロセス全体をより安全にする方法はありませんか?

前もって感謝します!

4

3 に答える 3

0

暗号化は、自己署名でも CA による署名でも同じように機能します。唯一の違いは、自己署名した場合、サイトを続行するには自分の所有物であるという警告が表示され、結果のサーバーが個人情報を解読し、悪意のある目的に使用できることです. 自己署名の場合、サーバーが誰であるかを検証する方法はありません。データは、自己署名されているか CA によって署名されているかに関係なく暗号化されており、中間者攻撃の場合、違いはありません。誰かが Wireshark や nmap などを使用してパケットを盗聴している可能性がありますが、どちらのシナリオでも、自己署名されているか CA によって署名されているかは同じです。通常、開発とテストでは自己署名証明書が使用され、製品では CA 署名証明書が使用されます。数ドルを節約するために、サイトに関連するリスクをエンド ユーザーに受け入れてほしくありません。

  If you are consuming the service in Java code you need to import the self 
 signed certificate in cacerts present in <PATH_TO_JRE>\lib\security\cacerts by
 the following command >keytool -import -alias <Alias Name> -file "PATH_TO_.crt"
 -keystore "PATH_TO_cacerts" -ext san=ip:127.0.0.1 

ip の代わりに san で www.mydomain.com のようなドメイン名を使用することもできます。

于 2015-08-30T19:45:18.880 に答える
0

これは明らかに中間者攻撃を非常に受けやすく、このソリューションはテスト目的でのみ正当であるように思われます。

正しい。それは根本的に安全ではありません。

私の質問は、証明書をプログラムでインポートしようとするときに、このプロセス全体をより安全にする方法はありませんか?

保護しようとしているチャネルを介して行う場合はそうではありません。信頼できる証明書は、別の手段で配信する必要があります。

getAcceptedIssuers().注:投稿したコードは、 null を返すことができないという契約を満たしていません。

于 2015-07-30T09:34:51.097 に答える