如何配置Spring Boot 2 WebFlux启用SSL?解决无通用密码套件握手异常
搞定javax.net.ssl.SSLHandshakeException: no cipher suites in common异常
刚复现了你遇到的这个SSL握手坑,先把完整的复现流程理明白,再给你分析问题根源和解决办法:
复现步骤
- 去start.spring.io创建Spring 2.0.1版本的项目,勾选「Reactive Web」依赖
- 下载项目压缩包并解压
- 执行这条keytool命令生成密钥库:
keytool -genkeypair -keystore demo/src/main/resources/keystore.jks - 设置密钥库密码,后面所有默认项(显示[Unknown])直接回车,确认证书信息
CN=Unknown, OU=Unknown,...的时候输入Yes - 给密钥设置和密钥库一样的密码
- 往项目的application配置文件(不管是properties还是yml)里加SSL相关配置(你提到的内容应该是类似下面的常见配置):
举个application.properties的例子:
server.ssl.key-store=classpath:keystore.jks server.ssl.key-store-password=你设置的密码 server.ssl.key-password=你设置的密码
为啥会出这问题?
no cipher suites in common说白了就是客户端和服务器能用上的加密套件完全没交集。你用默认参数生成的JKS密钥库,大概率用的是老旧的DSA算法,而Spring WebFlux(就是Reactive Web对应的框架)默认支持的加密套件里根本没这个算法;还有可能是密钥库的证书没配置对,导致服务器加载不出可用的加密套件。
怎么解决?
1. 重新生成兼容的密钥库
换RSA算法生成密钥库(这是现在主流兼容的算法),执行这条命令:
keytool -genkeypair -alias tomcat -keyalg RSA -keystore demo/src/main/resources/keystore.jks -keysize 2048
密码设置和之前一样就行,默认项直接回车确认没问题。
2. 明确配置服务器的加密套件
在application配置文件里加上支持的加密套件列表,选那些客户端和服务器都认的,比如:
server.ssl.ciphers=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_128_GCM_SHA256,TLS_RSA_WITH_AES_256_GCM_SHA384
这些套件兼容性很强,基本能覆盖大部分客户端。
3. 检查密钥库是否正常
用这条命令看看密钥库的证书信息,确认算法是RSA:
keytool -list -v -keystore demo/src/main/resources/keystore.jks
要是输出里显示Algorithm: RSA,那算法就没问题;如果是DSA,那就是根源所在了。
按照上面的步骤操作完,重启Spring应用,再访问HTTPS接口,这个握手异常应该就消失了。
内容的提问来源于stack exchange,提问作者stphngrtz
相关产品推荐
相关产品推荐

