是否有可能获取Java忽略“信任存储”,只是接受任何SSL证书,它得到?(Is it possibl

2019-06-17 22:57发布

我想写使用javax.mail API发送邮件的SSL客户端。 我遇到的问题是,我使用SSL,但服务器还与非标准SSL证书配置的服务器请求。 该网页,我发现说我需要将证书安装到信任存储。 我并不想这样做(我没有必要的权限。)

  1. 有没有一种方法获取Java只是忽略证书错误,并接受呢?
  2. 做不到这一点,是有办法有信任存储在本地我的程序,而不是安装的整个JVM?

Answer 1:

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


Answer 2:

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


Answer 3:

试试这个(回答问题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



Answer 4:

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



Answer 5:

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



文章来源: Is it possible to get Java to ignore the “trust store” and just accept whatever SSL certificate it gets?