JDK 1.8.0_121中如何按密钥大小约束禁用RSA 1024算法?
如何通过密钥大小约束禁用RSA 1024算法?
环境
- Java版本:
1.8.0_121
场景
已创建采用RSA 1024的证书,启用SSL后网站可正常通过HTTPS访问,现在需要禁用网站对RSA 1024算法的支持。
已尝试的操作
- 修改
jdk.certpath.disabledAlgorithms=RSA keySize < 2048:浏览器访问网站仍正常,RSA 1024未被禁用 - 修改
jdk.certpath.disabledAlgorithms=RSA:浏览器访问网站失败,RSA被完全禁用,抛出以下错误:
javax.net.ssl.SSLHandshakeException: no cipher suites in common at sun.security.ssl.Handshaker.checkThrown(Handshaker.java:1478) at sun.security.ssl.SSLEngineImpl.checkTaskThrown(SSLEngineImpl.java:535) at sun.security.ssl.SSLEngineImpl.writeAppRecord(SSLEngineImpl.java:1214) at sun.security.ssl.SSLEngineImpl.wrap(SSLEngineImpl.java:1186) at javax.net.ssl.SSLEngine.wrap(SSLEngine.java:469) at org.apache.tomcat.util.net.SecureNioChannel.handshakeWrap(SecureNioChannel.java:424) at org.apache.tomcat.util.net.SecureNioChannel.handshake(SecureNioChannel.java:205) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1411) at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:745)
问题分析
你之前修改的jdk.certpath.disabledAlgorithms参数,作用是限制证书路径验证过程中使用的算法,并不是用来控制SSL/TLS握手时允许使用的密钥交换算法的,所以只改这个参数无法达到禁用RSA 1024的目的。
正确解决方案
要通过密钥大小约束禁用RSA 1024,需要修改Java安全配置中的jdk.tls.disabledAlgorithms参数:
- 找到Java安装目录下的安全配置文件:
JAVA_HOME/jre/lib/security/java.security(如果是JDK 9+,路径是JAVA_HOME/conf/security/java.security) - 找到
jdk.tls.disabledAlgorithms配置项,添加RSA keySize < 2048到该配置的值中,示例:
(注意保留原有已禁用的算法,不要直接覆盖)jdk.tls.disabledAlgorithms=SSLv3, TLSv1, TLSv1.1, RSA keySize < 2048 - 重启你的Web服务器(比如Tomcat),让配置生效
- 验证:使用浏览器或SSL检测工具访问网站,此时RSA 1024的证书应该无法完成握手,网站会提示SSL错误;如果换成RSA 2048及以上的证书,网站可正常访问。
额外说明
- 如果你的应用有自定义的SSL配置(比如Tomcat的
server.xml中指定了 cipher suites),需要确保自定义的 cipher suites列表中不包含使用RSA 1024的套件 - 修改Java安全配置后,会影响所有使用该JVM运行的应用,如果你只想针对单个应用生效,可以通过JVM启动参数指定自定义的安全配置文件:
-Djava.security.properties=/path/to/custom/java.security
内容的提问来源于stack exchange,提问作者Hhovhann
相关产品推荐
相关产品推荐

