web-dev-qa-db-ja.com

「Java「トラストストア」を無視して、取得したSSL証明書を受け入れるだけでよいですか?」

Javax.mail APIを使用してメールを送信するSSLクライアントを作成しようとしています。私が抱えている問題は、SSLを使用するようサーバーが要求していることですが、サーバーも非標準のSSL証明書で構成されています。見つけたWebページには、トラストストアに証明書をインストールする必要があると書かれています。それをしたくありません(必要な権限がありません)。

  1. Javaを取得して、証明書エラーを無視して受け入れる方法はありますか?
  2. それが失敗した場合、トラストストアをプログラムのローカルにして、JVM全体にインストールしないようにする方法はありますか?
22
vy32

すべての証明書を受け入れる偽のTrustManagerを作成し、それをマネージャーとして登録する必要があります。このようなもの:

public class MyManager implements com.Sun.net.ssl.X509TrustManager {
  public boolean isClientTrusted(X509Certificate[] chain) { return true; }
  public boolean isHostTrusted(X509Certificate[] chain) { return true; }
  ...
}


com.Sun.net.ssl.TrustManager[] managers =
  new com.Sun.net.ssl.TrustManager[] {new MyManager()};

com.Sun.net.ssl.SSLContext.getInstance("SSL").
       .init(null, managers, new SecureRandom());
18
Zed

#1の作業コード(jdk1.6.0_23内)。

輸入

import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import Java.security.cert.X509Certificate;

実際のすべてのTrustManagerコードを信頼します。

TrustManager trm = new X509TrustManager() {
    public X509Certificate[] getAcceptedIssuers() {
        return null;
    }

    public void checkClientTrusted(X509Certificate[] certs, String authType) {

    }

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

SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, new TrustManager[] { trm }, null);
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
31
so_mv

これを試してください(質問2への回答):

System.setProperty("javax.net.ssl.trustStore", "/path/to/truststore");

これを追加のコマンドラインパラメータとして指定することもできます。

Java -Djavax.net.ssl.trustStore=/path/to/truststore <remaining arguments>

Fedoraでは、これはシステム全体の可能性がありますJavaトラストストア/etc/pki/Java/cacerts

7

VM引数に-Dtrust_all_cert=trueを追加するだけです。この引数は、Javaにすべての証明書チェックを無視するように指示します。

0
Ayman Hussain