java.lang.SecurityException: JCE cannot authenticate the Provider BC问题处理方法记录

实践证明:本文记录方法适用于任何环境下的java.lang.SecurityException: JCE cannot authenticate the Provider BC相关问题。

目录

一、环境情况

二、问题描述

三、解决办法 

四、总结


一、环境情况

环境:华为云 弹性云服务器 

jdk版本以及cpu情况:

二、问题描述

问题描述:我在华为云服务器上部署我们的一个产品的时候有授权文件校验,然后在读取文件时候就出现了这样的问题,提示:java.lang.SecurityException: JCE cannot authenticate the Provider BC 最终导致授权文件读取异常 系统不能正常运行的

问题现象:

三、解决办法 

经过百度 等多番查找资料 发现 是环境配置问题,解决方法如下:

我配置的jdk信息:

 1.找到jre下的配置文件java.security并修改:我用的是jdk1.8.0_311的aarch64版本 与其他版本的文件结构略微不同,我的路径 是:/opt/java/jdk1.8.0_311/jre/lib/security/下的java.security (不同环境的路径可能不同,要注意分辨)

在该配置文件里的 List of providers and their preference orders部分添加如下内容(尤其是红色框图部分):

具体如下:

security.provider.1=sun.security.provider.Sun
security.provider.2=sun.security.rsa.SunRsaSign
security.provider.3=sun.security.ec.SunEC
security.provider.4=com.sun.net.ssl.internal.ssl.Provider
security.provider.5=com.sun.crypto.provider.SunJCE
security.provider.6=sun.security.jgss.SunProvider
security.provider.7=com.sun.security.sasl.Provider
security.provider.8=org.jcp.xml.dsig.internal.dom.XMLDSigRI
security.provider.9=sun.security.smartcardio.SunPCSC
security.provider.10=sun.security.mscapi.SunMSCAPI
security.provider.11=org.bouncycastle.jce.provider.BouncyCastleProvider

 保存文件即可。

此时如果我们去再启动服务,发现还是会报错,问题依然没有解决。

参考其他资料,可知此时依旧缺少对应的jar包  bcprov-ext-jdk,jar包要放到jre的lib的ext目录下,如我的环境是:/opt/java/jdk1.8.0_311/jre/lib/ext下 。 那么用哪个版本 就是问题的关键。

这里我踩了一些坑,比如我把:bcprov-jdk15-135.jar、bcprov-jdk15-136.jar、bcprov-jdk16-143.jar 这些版本一起或者分别放进去

就都会出现这样的问题:提示我:java.lang.VerifyError: java. lang.VerifyError: class org. bouncycast le . asn1. ASN1Primitive overrides final method equals. (Ljava/lang/0bject;)

这种问题,基本就可以断定是jar包版本与当前的jdk版本不匹配了。

更换jar包,最终我下了个bcprov-ext-jdk15on-160.jar放进去

然后我再启动服务器,就没有发现报错了,加解密正常了,最后系统的授权文件也能正常读取了。 

这个问题我是第二次遇到了,这次记录一下,方便后续查阅,也供其他小伙伴参考一下。

这里附个 我使用的jar链接吧:

链接:https://pan.baidu.com/s/1zeY5PfvrPG9Rhp5l7D54Yw 
提取码:j0tl 

--来自百度网盘超级会员V3的分享

四、总结

遇到java.lang.SecurityException: JCE cannot authenticate the Provider BC 的问题需要先确认jdk的类型以及版本,目前我遇到的主要是oracle JDK的的时候。

处理办法就是:先配置jre目录下 jre/lib/security/下的java.security;

然后再将缺失的jar包 :bcprov-ext-jdk15on-160.jar放到jre的ext目录jre/lib/ext下,一般就可以解决了。 

遇到 "error constructing MAC: java.lang.SecurityException: JCE cannot authenticate the provider BC" 错误,通常是因为 Java 加密库 (Java Cryptography Extension, JCE) 中的某个安全提供者 (Provider) 没有正确配置或授权。BC (Bouncy Castle) 提供者在这种情况下出现问题。 解决步骤如下: 1. **检查JDK安装**:确保你的Java Development Kit (JDK) 安装包含了正确的加密库,特别是Bouncy Castle。有时它可能不是默认安装的一部分,需要单独下载并添加到JDK的jre/lib/security目录下。 2. **更新或添加BC JCE**:从Bouncy Castle官网下载最新版本的JCE Unlimited Strength Jurisdiction Policy Files,它们包含了解决此问题所需的权限文件。将下载的jar包放入`JAVA_HOME/jre/lib/security` 或 `JRE_HOME/lib/security` 目录下。 3. **重启JVM**:更改了库之后,你需要重启Java虚拟机(JVM),让系统加载新的安全提供者。 4. **检查安全策略**:打开`JAVA_HOME/jre/lib/security/java.security` 文件,查看是否正确添加了Bouncy Castle的provider信息。如果没有,需要添加类似这样的行: ``` security.provider.1=BC security.provider.10=bouncyCastleProvider ``` 5. **重新部署应用**:最后,重新部署你的应用程序,确保Java运行环境能够识别并使用新添加的BC Provider。 如果以上步骤都无法解决问题,可能是其他第三方库或者代码中存在冲突,尝试更新依赖库或排查相关的代码段。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值