问题描述

RestTemplate请求https,抛出如下异常:

javax.net.ssl.SSLHandshakeException: DH ServerKeyExchange does not comply to algorithm constraints
	at sun.security.ssl.Alert.createSSLException(Alert.java:131)
	at sun.security.ssl.Alert.createSSLException(Alert.java:117)
	at sun.security.ssl.TransportContext.fatal(TransportContext.java:311)
	at sun.security.ssl.TransportContext.fatal(TransportContext.java:267)
	at sun.security.ssl.TransportContext.fatal(TransportContext.java:258)

原因分析:

通过抛出的堆栈信息定位异常所在代码,如下图:
堆栈异常定位结果:算法约束条件校验未通过
这里校验的算法约束条件是从Java安全属性文件获取的,如下图:
算法约束条件
在系统Java的安全属性文件中,有一个[DH keySize < 2048]的约束条件,意思是公钥长度不能小于2048位,程序生成的是1024位,所以抛出了异常。
算法约束条件定位


解决方案:

方案一:修改系统的java安全属性文件。
这里文件一般都是在JRE目录下面,如:[你的jdk安装目录]/jre/lib/security/java.security
但是有的jdk安装后,会有一个java.config文件,
在linux上这个文件一般在/etc/crypto-policies/back-ends/java.config
这里需要注意的是:在java.config文件中配置的属性将会覆盖java.security文件中的属性,
所以我们只要确保这两个文件的jdk.tls.disabledAlgorithms属性的DH keySize < 1024即可。

方案二:如果你无法修改服务器的这个java配置文件,那可以尝试使用其他的请求方式,比如Webflux的WebClient,他默认的交换算法一般是RSA,不管用什么方法,最终只要满足他这个算法约束条件即可。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐