原因
在进行SSL握手时,所采用的证书算法不符合约束条件。
方案一
$JAVA_HOME/jre/lib/security/java.security 把其中的配置项: #jdk.certpath.disabledAlgorithms=MD2, MD5, RSA keySize < 1024, \ DSA keySize < 1024, EC keySize < 224 改成: jdk.certpath.disabledAlgorithms=, 或者直接注释掉: #jdk.certpath.disabledAlgorithms=MD2, MD5, RSA keySize < 1024, \ DSA keySize < 1024, EC keySize < 224
方案二
将自己实现的TrustAnyTrustManager改为继承自行的抽象类X509ExtendedTrustManager。
private static class TrustAnyTrustManager extends X509ExtendedTrustManager { //... //这里省略了一些必须要实现的用于验证证书的方法,在这里都是空方法 //... }
如果TrustAnyTrustManager是实现接口X509TrustManager,而不是继承抽象类:X509ExtendedTrustManager,那么JDK则会默认用自己的实现类AbstractTrustManagerWrapper来对服务器的证书算法进行验证,检查她们是否符合java.security里的配置要求!而如果我们的TrustAnyTrustManager继承了抽象类:X509ExtendedTrustManager,则SSLContextImpl就会使用我们自己的TrustAnyTrustManager来验证证书算法,而我们这个类所有的验证方法都是空方法(也就是不验证),那么自然也就不会抛异常了。