Java - 标准SSL证书全信任代码失败

时间:2014-05-31 19:21:17

标签: java ssl ssl-certificate

我认为到目前为止,几乎所有具有SSL证书信任错误经验的Java编码人员都使用过或者至少遇到过这段代码:

    // Create a trust manager that does not validate certificate chains
    TrustManager[] trustAllCerts;
    trustAllCerts = new TrustManager[] {
        new X509TrustManager() {
            @Override
            public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                return null;
            }
            @Override
            public void checkClientTrusted(X509Certificate[] certs, String authType) {
            }
            @Override
            public void checkServerTrusted(X509Certificate[] certs, String authType) {
            }
        }
    };

    // Install the all-trusting trust manager
    SSLContext sc = SSLContext.getInstance("SSL");
    sc.init(null, trustAllCerts, new java.security.SecureRandom());
    HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());

    // Create all-trusting host name verifier
    HostnameVerifier allHostsValid = new HostnameVerifier() {
        @Override
        public boolean verify(String hostname, SSLSession session) {
    return true;
        }
};

    // Install the all-trusting host verifier
    HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid);

到目前为止,我已成功使用此代码来通过其IP地址访问HTTPs站点时忽略证书不匹配(不要问我为什么这样做,这是一个完全不同的故事)。但是,我试图为另一个HTTPs站点做同样的事情,并发现此代码失败,但有以下异常:

javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: Certificates does not conform to algorithm constraints

所以,问题是,出了什么问题,我能做些什么呢?

1 个答案:

答案 0 :(得分:0)

我已经解决了这个问题。看起来服务器在其证书中使用MD2。到目前为止,我所知道的唯一解决方案是在JDK路径中找到jre / lib / security / java.security文件并将jdk.certpath.disabledAlgorithms = MD2更改为jdk.certpath.disabledAlgorithms =以便MD2算法不是禁用。这看起来很讨厌,但遗憾的是,我找不到以编程方式启用MD2的方法。

回顾过去,我现在记得我可以访问它,但只是在我更新Java之前,它杀死了java.security文件编辑。