28

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

  1. Javaに証明書エラーを無視させて受け入れる方法はありますか?
  2. それができない場合、トラスト ストアをプログラムのローカルにし、JVM 全体にインストールしない方法はありますか?
4

5 に答える 5

37

#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());
于 2011-04-15T00:00:14.217 に答える
18

すべての証明書を受け入れる偽の 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());
于 2009-08-02T16:41:11.950 に答える
8

これを試してください(質問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

于 2009-08-02T16:35:30.183 に答える