You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用KeyStore.getKey方法触发UnrecoverableKeyException的原因是什么?

搞定java.security.UnrecoverableKeyException: Rejected by the jceks.key.serialFilter or jdk.serialFilter property这个坑

刚碰到这个错误的时候我也一脸懵,毕竟官方的KeyStore.getKey()方法文档里根本没提这个异常——这其实是JDK较新版本引入的序列化安全过滤机制在背后搞事情。

为啥会出这个错?

当你从JCEKS类型的密钥库中取密钥时,底层的KeyProtector.unseal()方法需要反序列化加密后的密钥数据。而JDK新增的jceks.key.serialFilter(专门针对JCEKS密钥库)或者全局的jdk.serialFilter系统属性,设置了严格的序列化类白名单。如果密钥相关的序列化类没在白名单里,就会直接触发这个拒绝异常。

怎么解决?

给你几个实用的方案,按优先级来:

  • 精准添加白名单(推荐)
    把密钥对应的加密provider类加入jceks.key.serialFilter的白名单里,比如用SunJCE的话,就加这些:

    // 可以在应用启动时设置,或者用JVM参数
    System.setProperty("jceks.key.serialFilter", "com.sun.crypto.provider.*;java.security.*");
    

    用JVM启动参数的话更方便:

    -Djceks.key.serialFilter=com.sun.crypto.provider.*;java.security.*
    

    要是不确定具体要加哪些类,先临时用宽松规则测试(生产环境绝对不能这么干!):

    -Djceks.key.serialFilter=*
    
  • 检查JDK版本和密钥库兼容性
    这个过滤机制是在JDK 8u371、JDK 11.0.19这些版本后才加的。如果是升级JDK后才出的问题,确认下密钥库的密钥是不是用兼容的加密provider生成的,别用那些自定义的、没被过滤规则允许的密钥实现类。

  • 自定义KeyStore Provider(进阶操作)
    要是你有特殊需求,也可以自己实现KeyStore Provider绕开默认过滤,但这个操作风险高,得做严格的安全验证,普通场景不推荐。

划重点!

  • 生产环境千万别用*当过滤规则,这等于放弃了序列化安全防护,一定要只加确实需要的类。
  • jceks.key.serialFilter的优先级比全局的jdk.serialFilter高,所以针对JCEKS密钥库优先用前者,别影响其他地方的序列化操作。

内容的提问来源于stack exchange,提问作者tribbloid

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:14:16