原因

在进行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来验证证书算法,而我们这个类所有的验证方法都是空方法(也就是不验证),那么自然也就不会抛异常了。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐