28

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

  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 回答
3

只需添加-Dtrust_all_cert=true到 VM 参数。这个参数告诉 java 忽略所有的证书检查。

于 2016-11-21T07:33:29.947 回答
-6

在命令行中,您可以-noCertificationCheck向 java 添加参数以忽略证书检查。

于 2017-07-31T05:23:25.790 回答