升级Java至1.8.0_171后RSA公钥生成抛InvalidKeyException求助
解决Java 8u171升级后RSA公钥构建抛出
exponent is larger than modulus异常的方案 这个问题我太熟了!Java 8 Update 171开始,Oracle调整了RSA公钥的校验逻辑,严格遵循了RFC规范——要求公钥指数e必须满足1 < e < n(n就是你的模数),而之前的版本可能允许一些不符合规范的密钥通过校验,所以升级后就炸了。下面给你几个可行的解决思路:
1. 先排查模数和指数的解析/传递是否有误
这是最常见的原因!你得仔细确认:
- 是不是把模数和指数的位置搞反了?比如本来应该传
(n, e),结果写成了(e, n),那必然会出现指数大于模数的情况。 - 解析
modulus和exponent的时候用对进制了吗?比如如果它们是十六进制字符串,你是不是误用了new BigInteger(str)(默认十进制解析)?这种情况要改成new BigInteger(str, 16)。 - 字节数组转BigInteger时有没有处理符号位?如果字节数组是无符号的,要加上
1作为第二个参数:new BigInteger(1, byteArray),不然可能会把正数解析成负数,导致大小判断逻辑出错。
2. 修正密钥对本身的合规性
如果上面的排查没问题,那说明你的RSA密钥对本身就不符合规范——正常的RSA公钥指数e都是用小值,比如最常用的65537(也就是0x10001),而模数n至少是1024位(现在推荐2048位以上),e肯定远小于n。
- 如果你是自己生成的密钥对,重新生成符合规范的RSA密钥对,确保
e的大小在1 < e < n范围内。 - 如果密钥对是第三方提供的,联系对方确认是不是他们生成时出了问题,让他们提供合规的公钥。
3. 临时绕过校验(不推荐,仅应急用)
如果实在没办法立刻修正密钥或代码,可以通过设置系统属性来临时关闭这个严格校验,但强烈不推荐长期使用,因为不符合规范的RSA密钥可能存在安全漏洞:
- 在JVM启动参数里添加:
-Djdk.security.allowInvalidRSAExponents=true - 或者在代码开头设置:
System.setProperty("jdk.security.allowInvalidRSAExponents", "true");
最后提醒一句,尽量优先用前两种方案,第三种只是权宜之计,毕竟安全规范的升级是为了避免潜在风险。
内容的提问来源于stack exchange,提问作者user1563721
相关产品推荐
相关产品推荐

