IntelliJ Idea调试模式下连接Apache Derby报DH密钥尺寸异常
解决IntelliJ调试模式下Apache Derby连接抛出DH密钥大小异常的问题
问题场景
- IntelliJ开发Java项目,连接Apache Derby数据库
- 正常运行无报错,功能表现完全正常
- 调试模式下连接数据库时抛出异常:
java.security.InvalidAlgorithmParameterException: DH key size must be multiple of 64, and can only range from 512 to 8192 (inclusive). The specific key size 256 is not supported
- 异常会触发IntelliJ反编译器自动打开;捕获异常后继续执行程序,后续运行无异常,且两次测试使用的JVM版本完全一致
原因分析
调试模式下,IntelliJ的JDWP调试代理会干预JVM的SSL/TLS握手流程,导致Derby端尝试使用256位DH密钥协商。而JVM默认安全策略限制DH密钥最小长度为512位,因此触发异常。正常运行时无调试代理干预,所以不会出现该问题。
解决方案
1. 调整JVM安全策略配置
找到JVM安装目录下的jre/lib/security/java.security文件,做以下修改:
- 定位
jdk.tls.disabledAlgorithms配置项,移除其中的DH keySize < 768(若存在),或调整为DH keySize < 256以放宽密钥长度限制 - 或在文件末尾添加
jdk.crypto.KeyAgreement.legacyKDF=true,启用旧版密钥协商算法支持,兼容小长度DH密钥
2. 配置Derby使用合规协议
- 在数据库连接URL中指定TLSv1.2及以上协议:
String url = "jdbc:derby://localhost:1527/yourDB;ssl=true;sslProtocol=TLSv1.2"; - 或修改Derby的
derby.properties配置文件,添加derby.ssl.protocol=TLSv1.2,强制Derby使用符合JVM安全要求的协议
3. 修改IntelliJ调试VM参数
打开IntelliJ的「Run/Debug Configurations」,找到对应调试配置,在「VM options」中添加以下参数之一:
- 放宽DH密钥限制:
-Djdk.tls.disabledAlgorithms="SSLv3, TLSv1, TLSv1.1, DH keySize < 256" - 启用旧版密钥协商:
-Djdk.crypto.KeyAgreement.legacyKDF=true
补充说明
正常运行状态是程序的真实业务表现,调试模式下的异常属于调试环境干扰问题。若捕获异常后不影响后续功能,可暂时忽略,但建议按上述方案修复,避免调试过程中频繁触发异常和反编译器打开的干扰。
内容的提问来源于stack exchange,提问作者res1
相关产品推荐
相关产品推荐

