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,不管用什么方法,最终只要满足他这个算法约束条件即可。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)