是否有可能让Java忽略“信任库”,只接受它获得的任何SSL证书?

2022-09-01 13:56:47

我正在尝试编写一个使用javax.mail API发送邮件的SSL客户端。我遇到的问题是服务器请求我使用SSL,但服务器也配置了非标准SSL证书。我找到的网页说我需要将证书安装到信任存储中。我不想这样做(我没有必要的权限。

  1. 有没有办法让Java忽略证书错误并接受它?
  2. 如果做不到这一点,有没有办法让信任存储区成为我的程序的本地信任库,而不是为整个JVM安装信任存储?

答案 1

#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 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());

答案 2

您需要创建一个接受所有证书的假 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());