当前位置: 首页 > article >正文

【异常解决】JDK21升级中SecurityException: JCE无法验证BC提供者的深度解析

1. 遇到SecurityException时发生了什么最近在把项目升级到JDK21的时候突然遇到了一个让人头疼的异常SecurityException: JCE cannot authenticate the provider BC。这个错误直接导致我们的加密功能全部瘫痪整个系统都无法正常启动。刚开始看到这个报错的时候说实话有点懵因为之前用JDK8的时候一切正常怎么升级到JDK21就出问题了仔细看错误日志发现关键信息是jar:file:/app//service.jar!/BOOT-INF/lib/bcprov-jdk14-138.jar!/ has unsigned entries。这提示我们项目中使用的Bouncy Castle简称BC加密库的jar包没有经过数字签名。在JDK21中JCEJava Cryptography Extension对加密提供者的验证变得更加严格要求所有加密提供者必须经过签名认证才能使用。2. 为什么JDK21会报这个错2.1 JCE安全机制的升级JDK21对安全机制做了不少改进特别是在加密相关功能上。JCE现在会严格检查所有加密提供者的签名确保它们来自可信来源。这个改动其实是为了提高系统的安全性防止恶意代码伪装成加密提供者混入系统。在我们的案例中项目里混入了老版本的bcprov-jdk14-138.jar这个jar包恰好没有经过签名。在JDK8时代JCE对这方面检查不严格所以能正常运行。但到了JDK21这个无证驾驶的加密提供者就被拦下来了。2.2 依赖冲突的常见表现这类问题通常有几种典型表现应用启动时直接抛出SecurityException加密相关功能突然失效日志中会明确提示哪个jar包有问题错误信息中通常包含unsigned entries这样的关键词如果你在升级JDK后遇到类似情况很大概率也是因为项目中混入了不兼容的老版本加密库。3. 如何定位问题依赖3.1 使用Maven依赖树分析要解决这个问题首先得找到问题jar包是怎么混进来的。Maven提供了一个很实用的命令mvn dependency:tree这个命令会打印出完整的依赖树你可以搜索bcprov或者bouncycastle关键字找到所有相关的依赖项。在我们的案例中发现是通过hutool-all间接引入了老版本的bcprov-jdk14。3.2 检查jar包签名信息你也可以直接检查jar包的签名状态jarsigner -verify bcprov-jdk14-138.jar如果看到jar is unsigned的提示那就确认是这个jar包导致的问题了。4. 完整解决方案步骤4.1 排除冲突依赖首先要在pom.xml中排除有问题的老版本依赖。以我们的项目为例需要这样修改dependency groupIdcn.hutool/groupId artifactIdhutool-all/artifactId exclusions exclusion artifactIdbcprov-jdk14/artifactId groupIdbouncycastle/groupId /exclusion exclusion artifactIdbcprov-jdk14/artifactId groupIdorg.bouncycastle/groupId /exclusion /exclusions /dependency注意要检查所有可能引入Bouncy Castle的依赖确保把所有老版本都排除干净。4.2 添加兼容的新版本依赖排除老版本后需要添加JDK21兼容的新版本dependency groupIdorg.bouncycastle/groupId artifactIdbcprov-jdk18on/artifactId version1.77/version /dependency dependency groupIdorg.bouncycastle/groupId artifactIdbcpkix-jdk18on/artifactId version1.77/version /dependency这里我推荐使用jdk18on版本因为它对新的JDK版本支持最好。虽然名字里有18但实际上它完全兼容JDK21。4.3 清理和重建项目完成上述修改后一定要执行完整的清理和重建mvn clean install有时候IDE会缓存旧的依赖所以最好在命令行执行这个命令确保所有改动都生效。5. 验证解决方案是否有效5.1 检查运行时依赖启动应用后可以通过以下代码验证当前加载的Bouncy Castle版本Provider bcProvider Security.getProvider(BC); System.out.println(BouncyCastle版本: bcProvider.getVersion());正确的输出应该是你新添加的版本号如1.77而不是之前有问题的老版本。5.2 测试加密功能最后别忘了实际测试加密功能是否恢复正常。可以写个简单的测试用例Test public void testEncryption() throws Exception { KeyPairGenerator keyGen KeyPairGenerator.getInstance(RSA, BC); keyGen.initialize(2048); KeyPair keyPair keyGen.generateKeyPair(); // 如果没有抛出异常说明一切正常 }6. 可能遇到的坑和注意事项6.1 多模块项目的依赖管理如果你的项目有多个模块要特别注意依赖传递问题。有时候一个模块排除了老版本但另一个模块又引入了。这种情况下建议在父pom中统一管理Bouncy Castle的版本。6.2 其他依赖的兼容性问题除了Bouncy Castle本身还要注意其他依赖是否要求特定版本的BC。比如某些安全框架可能会强制指定BC版本。遇到这种情况可能需要升级这些框架到最新版本。6.3 部署环境的检查即使本地测试通过了部署到服务器上还是可能出问题。特别是如果你使用Docker或者CI/CD流水线要确保构建环境没有缓存旧的依赖。一个实用的技巧是在Dockerfile中加入清理命令RUN mvn dependency:purge-local-repository7. 为什么选择jdk18on版本在解决这个问题的过程中我发现Bouncy Castle有多个版本分支jdk14: 老版本已停止维护jdk15on: 较新的版本jdk18on: 最新的版本分支虽然jdk15on也能工作但jdk18on有更多的新特性和性能优化。特别是对于使用JDK17及以上版本的项目jdk18on是最佳选择。它经过了更严格的安全审计也修复了早期版本中的一些漏洞。8. 更深层次的安全考量这个问题表面上看是个技术兼容性问题但实际上涉及重要的安全原则。JDK21强制要求加密提供者必须签名这个改变非常合理。在真实的生产环境中使用未签名的加密组件存在严重的安全风险无法验证代码来源可能被植入恶意代码无法保证代码没有被篡改过难以进行安全审计和漏洞追踪所以虽然这个改动给我们带来了些麻烦但从长远看是值得的。作为开发者我们应该养成只使用经过验证的加密库的好习惯。

相关文章:

【异常解决】JDK21升级中SecurityException: JCE无法验证BC提供者的深度解析

1. 遇到SecurityException时发生了什么 最近在把项目升级到JDK21的时候,突然遇到了一个让人头疼的异常:SecurityException: JCE cannot authenticate the provider BC。这个错误直接导致我们的加密功能全部瘫痪,整个系统都无法正常启动。刚开…...

电赛小白避坑指南:用STM32F103C8T6+L298N驱动板搞定蓝牙遥控循迹小车的完整硬件清单与接线图

电赛新手实战:从零搭建STM32蓝牙循迹小车的避坑手册 第一次参加电子设计竞赛的新手们,面对桌上散落的STM32开发板、电机驱动模块和各种传感器,往往会有种无从下手的茫然感。去年此时,我也曾盯着L298N驱动板上密密麻麻的接线端子发…...

Move Mouse终极指南:告别电脑自动休眠的完整解决方案

Move Mouse终极指南:告别电脑自动休眠的完整解决方案 【免费下载链接】movemouse Move Mouse is a simple piece of software that is designed to simulate user activity. 项目地址: https://gitcode.com/gh_mirrors/mo/movemouse 你是否厌倦了在线会议时离…...

UE5 UI控件实战指南 —— 从基础到高级布局技巧

1. UE5 UI控件基础入门 第一次打开UE5的UMG编辑器时,看到琳琅满目的控件面板可能会有点懵。别担心,我们先从最基础的几个控件开始,就像学写字要先认识笔画一样。Image和Text这两个控件,基本上每个UI界面都离不开它们。 Image控件就…...

Linux宝塔面板高效部署Go项目:从零配置到一键启动

1. 环境准备:从零搭建Go开发环境 第一次在Linux上用宝塔面板部署Go项目时,我对着命令行界面发呆了半小时。后来发现,其实用宝塔的图形化界面配合几个关键命令,整个过程比想象中简单得多。下面我就把踩坑后总结的最优路径分享给你。…...

RK3588实战:Qt+OpenCV环境搭建与USB摄像头实时采集全攻略

1. 环境准备:从零搭建RK3588开发环境 第一次拿到RK3588开发板时,我和大多数开发者一样兴奋又忐忑。这款六核ARM处理器在嵌入式视觉领域确实是个狠角色,但要让它的性能真正发挥出来,环境搭建就是第一道门槛。这里分享我反复验证过的…...

Sunshine游戏串流终极配置指南:5个步骤实现4K HDR完美体验

Sunshine游戏串流终极配置指南:5个步骤实现4K HDR完美体验 【免费下载链接】Sunshine Self-hosted game stream host for Moonlight. 项目地址: https://gitcode.com/GitHub_Trending/su/Sunshine 还在为游戏串流时的卡顿和画质损失而烦恼吗?Suns…...

从策略模式到RAID5:一个电商促销系统背后的架构设计思维

电商促销系统架构设计:从策略模式到RAID5的技术演进 1. 电商促销系统的架构挑战 每逢大促,电商平台总会面临流量洪峰的考验。去年双十一,某头部电商的订单系统在开场第一分钟就收到了超过100万笔交易请求,而促销计算模块的响应时间…...

DEX交易所系统搭建全攻略:从0到1构建「零信任」交易生态的底层逻辑

引言:DEX的「冰与火之歌」——去中心化表象下的技术暗战2024年,DEX(去中心化交易所)日均交易量突破85亿,UniswapV4单日手续费收入超200万。但在这串数字背后,是一个被90%开发者忽视的真相:DEX的…...

如何告别城通网盘龟速下载:终极免费解析工具使用指南

如何告别城通网盘龟速下载:终极免费解析工具使用指南 【免费下载链接】ctfileGet 获取城通网盘一次性直连地址 项目地址: https://gitcode.com/gh_mirrors/ct/ctfileGet 你是否曾在深夜等待城通网盘的大文件下载完成,看着进度条缓慢爬行&#xff…...

联盟链:企业数字化转型的“信任基建“开发全攻略

引言:当信任成为商业世界的稀缺品在数字化转型的浪潮中,企业正面临一个核心矛盾:数据共享的需求与信任缺失的鸿沟。供应链中,核心企业难以实时追踪供应商的原材料来源;金融领域,跨境支付仍需依赖第三方机构…...

如何快速下载B站视频?BilibiliDown终极免费工具完整指南

如何快速下载B站视频?BilibiliDown终极免费工具完整指南 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader 😳 项目地址: https://gitcode.com/gh_mirrors…...

思源宋体终极使用指南:7款免费中文宋体字体完全配置手册

思源宋体终极使用指南:7款免费中文宋体字体完全配置手册 【免费下载链接】source-han-serif-ttf Source Han Serif TTF 项目地址: https://gitcode.com/gh_mirrors/so/source-han-serif-ttf 还在为中文设计项目寻找高质量且完全免费的字体资源吗?…...

深度解析caj2pdf:高效CAJ转PDF开源解决方案完全指南

深度解析caj2pdf:高效CAJ转PDF开源解决方案完全指南 【免费下载链接】caj2pdf Convert CAJ (China Academic Journals) files to PDF. 转换中国知网 CAJ 格式文献为 PDF。佛系转换,成功与否,皆是玄学。 项目地址: https://gitcode.com/gh_m…...

DDrawCompat终极指南:5分钟让Windows老游戏重获新生

DDrawCompat终极指南:5分钟让Windows老游戏重获新生 【免费下载链接】DDrawCompat DirectDraw and Direct3D 1-7 compatibility, performance and visual enhancements for Windows Vista, 7, 8, 10 and 11 项目地址: https://gitcode.com/gh_mirrors/dd/DDrawCom…...

如何用3分钟免费备份你的QQ空间所有历史说说?GetQzonehistory终极指南

如何用3分钟免费备份你的QQ空间所有历史说说?GetQzonehistory终极指南 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 在数字记忆日益珍贵的今天,你是否担心QQ空…...

Vue-seamless-scroll实战:优化大屏数据表格的无缝滚动与交互体验

1. 为什么选择vue-seamless-scroll实现大屏表格滚动 在大屏数据展示项目中,表格数据的动态滚动几乎是标配需求。传统实现方式通常需要手动编写JavaScript控制DOM元素的transform属性,不仅代码量大,还要处理滚动边界、动画流畅度等细节问题。而…...

为什么安全工程师一定要学 JavaScript?别只把它当“网页特效语言”

很多人提到 JavaScript,第一反应还是“写网页按钮、做轮播图、搞点页面特效”。 这个理解不能说错,但如果你是做网络安全的,只把它看到这一步,明显不够。 现在的 Web 攻防,很多核心问题都发生在浏览器这一层。 而浏览器里最活跃、最关键、最容易出安全问题的语言,就是 J…...

别再把 JavaScript 和 Java 搞混了:从网页特效到安全攻防,带你重新认识 JS

很多人一听到 JavaScript,第一反应就是: “哦,这不就是做网页特效的吗?” 再进一步,有人还会顺嘴来一句: “它跟 Java 差不多吧?” 如果你真这么理解,那在网络安全领域里,可能第一步就走偏了。 今天这篇文章,咱们不讲空洞概念,直接从安全工程师的视角,聊清楚 Jav…...

GridPlayer终极指南:如何轻松实现多视频并行播放与同步管理

GridPlayer终极指南:如何轻松实现多视频并行播放与同步管理 【免费下载链接】gridplayer Play videos side-by-side 项目地址: https://gitcode.com/gh_mirrors/gr/gridplayer 还在为频繁切换视频窗口而烦恼吗?GridPlayer这款开源多视频播放器正是…...

MASA全家桶汉化包:快速解决Minecraft模组英文界面困扰的完整指南

MASA全家桶汉化包:快速解决Minecraft模组英文界面困扰的完整指南 【免费下载链接】masa-mods-chinese 一个masa mods的汉化资源包 项目地址: https://gitcode.com/gh_mirrors/ma/masa-mods-chinese 你是否厌倦了在Minecraft中面对密密麻麻的英文模组选项&…...

差分隐私实战:用Python+Laplace噪声保护你的敏感数据(附完整代码)

差分隐私实战:用PythonLaplace噪声保护敏感数据 在数据驱动的时代,保护用户隐私已成为开发者不可回避的责任。想象一下,当你的应用需要分析员工薪资分布或处理医疗记录时,如何在保证数据价值的同时避免泄露个体信息?差…...

如何适配自定义激光雷达数据到LIO-SAM:解决ring和time参数缺失问题

非标准激光雷达与LIO-SAM的深度适配指南:从参数解析到实战优化 当开发者尝试将速腾、Livox等非Velodyne雷达接入LIO-SAM框架时,往往会遇到两个关键障碍:点云数据中缺少ring(线束编号)和time(时间戳&#xf…...

Ostrakon-VL-8B快速部署教程:3步完成GPU环境配置与模型调用

Ostrakon-VL-8B快速部署教程:3步完成GPU环境配置与模型调用 想试试那个能看懂图片还能跟你聊天的AI模型吗?Ostrakon-VL-8B最近挺火的,它是个多模态模型,简单说就是既能理解图片内容,又能根据你的问题生成文字回答。听…...

解放双手:3分钟打造你的Windows本地语音识别助手

解放双手:3分钟打造你的Windows本地语音识别助手 【免费下载链接】TMSpeech 腾讯会议摸鱼工具 项目地址: https://gitcode.com/gh_mirrors/tm/TMSpeech 还在为会议记录手忙脚乱?还在为视频字幕制作烦恼?今天我要向你介绍TMSpeech——一…...

从AST到LLVM IR:一个Java程序员的编译器实验手记(含完整类设计)

从AST到LLVM IR:一个Java程序员的编译器实验手记 当第一次在IDE里按下"Run"按钮时,你可能从未想过那些优雅的高级语言代码是如何变成机器能理解的0和1。作为Java开发者,我们习惯了JVM带来的便利,但编译器背后的魔法依然…...

BilibiliDown:Java跨平台B站视频下载器的完整技术指南

BilibiliDown:Java跨平台B站视频下载器的完整技术指南 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader 😳 项目地址: https://gitcode.com/gh_mirrors/b…...

深度解析Recaf插件化架构:如何构建模块化的Java字节码编辑器

深度解析Recaf插件化架构:如何构建模块化的Java字节码编辑器 【免费下载链接】Recaf The modern Java bytecode editor 项目地址: https://gitcode.com/gh_mirrors/re/Recaf 在现代Java开发工具领域,模块化设计已成为提升系统可维护性和扩展性的关…...

Rust 模块系统高级应用指南

Rust 模块系统高级应用指南 1. 模块系统基础 Rust 的模块系统用于组织代码,它允许我们将代码分解为多个文件和模块,提高代码的可读性和可维护性。 // src/lib.rs mod utils;pub fn main() {utils::greet(); }// src/utils.rs pub fn greet() {println!(&…...

RuoYi前后端分离项目在K8s中的高可用部署实践(附避坑指南)

RuoYi前后端分离项目在Kubernetes中的高可用部署实战 当企业级应用需要从单体架构向云原生转型时,Kubernetes无疑是最佳选择之一。本文将深入探讨如何在生产环境中实现RuoYi这一流行开源框架的高可用部署,涵盖从集群规划到故障恢复的全流程实战经验。 1.…...