我认为到目前为止,几乎所有具有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
所以,问题是,出了什么问题,我能做些什么呢?
答案 0 :(得分:0)
我已经解决了这个问题。看起来服务器在其证书中使用MD2。到目前为止,我所知道的唯一解决方案是在JDK路径中找到jre / lib / security / java.security文件并将jdk.certpath.disabledAlgorithms = MD2更改为jdk.certpath.disabledAlgorithms =以便MD2算法不是禁用。这看起来很讨厌,但遗憾的是,我找不到以编程方式启用MD2的方法。
回顾过去,我现在记得我可以访问它,但只是在我更新Java之前,它杀死了java.security文件编辑。