Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Linux 环境下 java17 使用 Bouncy Castle 做加解密会出现 JCE cannot authenticate the provider BC 异常 #2631

Open
FULaBUla opened this issue Sep 25, 2022 · 34 comments
Assignees
Labels

Comments

@FULaBUla
Copy link
Contributor

版本情况

JDK版本: oracle java 17
hutool版本: 5.8.7(请确保最新尝试是否还有问题)

问题描述(包括截图)

Linux 环境下 java17 使用 Bouncy Castle 做加解密会出现 JCE cannot authenticate the provider BC 。
spring-projects/spring-boot#28837 中有讨论过这个问题,在 2.7.2 及之前版本的springboot 有修复过这个问题,通过使用

bootJar {
    requiresUnpack '**/bcprov-jdk15on-*.jar'
}

可以解决问题,但是后来发现又会导致别的问题出现,所有修改被回归了。

在新的 2.7.3 和 2.74 版本依旧无法支持使用上面那个修改调用加解密库。

在议题中有另一个方式可以解决问题就是在调用 Bouncy Castle 前执行 Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());

希望可以将这句话加到 hutool 调用 Bouncy Castle 的语句前,这样每次调用工具类的时候不需要在自己手动加了。

@CherryRum
Copy link
Collaborator

这个问题归根来说还是,jce中Security文件中缺少这个,而您说的方案是运行前临时假如环境变量,虽然是可行的,但是某些打包环境下,还是会出现问题,最好的办法还是部署时候加个环境变量,修改下Security文件

@looly
Copy link
Member

looly commented Sep 26, 2022

嗯……虽然不能完全解决这个问题,5.8.8.会在全局引用BC时调用下这个方法,来解决部分环境问题。

@looly looly closed this as completed Sep 26, 2022
@looly looly added the bug label Sep 26, 2022
@FULaBUla
Copy link
Contributor Author

FULaBUla commented Sep 26, 2022

这个问题归根来说还是,jce中Security文件中缺少这个,而您说的方案是运行前临时假如环境变量,虽然是可行的,但是某些打包环境下,还是会出现问题,最好的办法还是部署时候加个环境变量,修改下Security文件

可惜 java17 没有 security 文件,之前确实想改来着

@CherryRum
Copy link
Collaborator

CherryRum commented Sep 26, 2022 via email

@FULaBUla
Copy link
Contributor Author

我的是有的?

---原始邮件--- 发件人: @.> 发送时间: 2022年9月26日(周一) 晚上7:02 收件人: @.>; 抄送: @.@.>; 主题: Re: [dromara/hutool] Linux 环境下 java17 使用 Bouncy Castle 做加解密会出现 JCE cannot authenticate the provider BC 异常 (Issue #2631) 这个问题归根来说还是,jce中Security文件中缺少这个,而您说的方案是运行前临时假如环境变量,虽然是可行的,但是某些打包环境下,还是会出现问题,最好的办法还是部署时候加个环境变量,修改下Security文件 可惜java17没有security文件,之前确实想改来着 — Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you commented.Message ID: @.***>

你是用jdk生成的jre吗?我直接用的oracle jdk17,emmm

@CherryRum
Copy link
Collaborator

@FULaBUla
看下这个地方
image

@FULaBUla
Copy link
Contributor Author

@FULaBUla 看下这个地方 image

啊,29500B87尴尬了,看来是之前找错地方了。谢谢啦

@FULaBUla
Copy link
Contributor Author

FULaBUla commented Oct 4, 2022

@FULaBUla 看下这个地方 image

我发现 jdk17 禁用了 ext,配置完了 security 文件后不知道应该把那个 jar 放在哪里,如果只配置不做别的操作,直接 springboot 打包运行还是会报错

@epca-job
Copy link

@FULaBUla What is the final solution?

@epca-job
Copy link

epca-job commented Oct 24, 2022

@CherryRum 咨询下oraclejdk17 使用 Bouncy Castle 做加解密会出现 JCE cannot authenticate the provider BC 异常, 完整的解决方案有吗?

@CobraStarLE
Copy link

@FULaBUla
看下这个地方
image
具体配置哪个

@CobraStarLE
Copy link

@FULaBUla 看下这个地方 image

啊,29500B87尴尬了,看来是之前找错地方了。谢谢啦

改什么地方啊

@chenhongen
Copy link

所以怎么解决现在

@looly
Copy link
Member

looly commented Dec 26, 2022

@chenhongen 不要打fatjar,bc库单独引入。

@ixqbar
Copy link

ixqbar commented Jan 12, 2023

我也遇到了同样的问题 库单独引入测试无效

只能 SecureUtil.disableBouncyCastle();

@ixqbar
Copy link

ixqbar commented Jan 12, 2023

Caused by: cn.hutool.crypto.CryptoException: SecurityException: JCE cannot authenticate the provider BC
	at cn.hutool.crypto.SecureUtil.createCipher(SecureUtil.java:1034)
	at cn.hutool.crypto.CipherWrapper.<init>(CipherWrapper.java:39)
	at cn.hutool.crypto.symmetric.SymmetricCrypto.init(SymmetricCrypto.java:150)
	at cn.hutool.crypto.symmetric.SymmetricCrypto.<init>(SymmetricCrypto.java:127)
	at cn.hutool.crypto.symmetric.AES.<init>(AES.java:190)
	at cn.hutool.crypto.symmetric.AES.<init>(AES.java:165)
	at cn.hutool.crypto.symmetric.AES.<init>(AES.java:94)
	at cn.hutool.crypto.symmetric.AES.<init>(AES.java:81)

@CherryRum
Copy link
Collaborator

@CherryRum 咨询下oraclejdk17 使用 Bouncy Castle 做加解密会出现 JCE cannot authenticate the provider BC 异常, 完整的解决方案有吗?

只能打包时候不使用默认的打包,单独打包bc
建议openjdk吧,spring社区到现在都没解决

@rexlin600
Copy link

我是这解决的

private static final AES SINGLE_AES;

static {
SecureUtil.disableBouncyCastle();
SINGLE_AES = SecureUtil.aes(AES_KEY.getBytes(StandardCharsets.UTF_8));
}

@CobraStarLE
Copy link

CobraStarLE commented Jul 26, 2023 via email

@oniubi
Copy link

oniubi commented Jan 7, 2024

@FULaBUla 看下这个地方 image

我发现 jdk17 禁用了 ext,配置完了 security 文件后不知道应该把那个 jar 放在哪里,如果只配置不做别的操作,直接 springboot 打包运行还是会报错

嗯,我也是发现这个jdk17禁用了ext,提示如下:
<JAVA_HOME>/lib/ext exists, extensions mechanism no longer supported; Use -classpath instead.
.Error: Could not create the Java Virtual Machine.

@oniubi
Copy link

oniubi commented Jan 7, 2024

我也遇到了同样的问题 库单独引入测试无效

只能 SecureUtil.disableBouncyCastle();

我也是,用了SecureUtil.disableBouncyCastle();才不报错,其他的改/lib/security/java.policy和conf/security/java.security,都没有解决。
1、security.provider.10=org.bouncycastle.jce.provider.BouncyCastleProvider
2、Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
以上两步我都试过了,没用。
但是在main中增加:
SecureUtil.disableBouncyCastle();
不报错了,要不要这样用,兄弟们自行斟酌!
我用的jdk是oracle的jdk-17.0.9。

@looly looly reopened this Jan 7, 2024
@looly
Copy link
Member

looly commented Jan 7, 2024

6.x做一些改造,抛弃JCE API,单独定义对象来封装BC库的方法,我想能绕过安全验证。

此issue暂时打开保留。

@oniubi
Copy link

oniubi commented Jan 7, 2024

@chenhongen 不要打fatjar,bc库单独引入。

bc库单独引入好像没用,我用的jdk是oracle的jdk-17.0.9。

@looly looly added feature and removed bug labels Jan 7, 2024
@looly
Copy link
Member

looly commented Jan 7, 2024

@oniubi 后来我才发现,确实JDK新版中增加了对加密库的要求,就算是单独引入依旧存在这个问题。

因此打开此issue,6.x单独封装BC库了,跳过JCE。

@FULaBUla
Copy link
Contributor Author

FULaBUla commented Feb 2, 2024

// https://mvnrepository.com/artifact/org.bouncycastle/bcpkix-jdk18on
implementation 'org.bouncycastle:bcpkix-jdk18on:1.77'
可以试试这个版本 @looly @oniubi 应该是可以了

@lliyuu520
Copy link

// https://mvnrepository.com/artifact/org.bouncycastle/bcpkix-jdk18on implementation 'org.bouncycastle:bcpkix-jdk18on:1.77' 可以试试这个版本 @looly @oniubi 应该是可以了

试了,不行,JDK版本oracle 17.0.6,用上面的SecureUtil.disableBouncyCastle()可以解决

@cxhello
Copy link

cxhello commented Jun 15, 2024

项目中需要使用SM4算法对配置文件解密,本地启动没问题,线上报JCE cannot authenticate the provider BC错误,最后将 Dockerfile 的基础镜像换成了 openjdk 解决了,感谢 @CherryRum 提供的思路。

@CherryRum
Copy link
Collaborator

CherryRum commented Jun 15, 2024 via email

@zeahoo
Copy link

zeahoo commented Jul 17, 2024

今天也遇到同样的问题
电脑环境: m1 pro
JDK 版本: azul-23 aarch64
Hutool 版本: 5.8.29
无论是否添加了bcpkix-jdk18on(1.77) 都会报错

@CherryRum
Copy link
Collaborator

@CherryRum CherryRum self-assigned this Aug 5, 2024
@running17
Copy link

@zeahoo @chenhongen @oniubi @lliyuu520 麻烦尝试下最先 https://www.oracle.com/java/technologies/javase/17-0-10-relnotes.html
java version "17.0.11" 2024-04-16 LTS
Java(TM) SE Runtime Environment (build 17.0.11+7-LTS-207)
Java HotSpot(TM) 64-Bit Server VM (build 17.0.11+7-LTS-207, mixed mode, sharing)
依然存在这个问题

@lgbisha
Copy link

lgbisha commented Aug 28, 2024

java version "21.0.4" 2024-07-16 LTS
Java(TM) SE Runtime Environment Oracle GraalVM 21.0.4+8.1 (build 21.0.4+8-LTS-jvmci-23.1-b41)
Java HotSpot(TM) 64-Bit Server VM Oracle GraalVM 21.0.4+8.1 (build 21.0.4+8-LTS-jvmci-23.1-b41, mixed mode, sharing)
虽然存在问题,但是SecureUtil.disableBouncyCastle(); 有效

@dddddkkkkk
Copy link

将jdk 升级到17.0.13 可以解决这个问题 Adoptium JDK17

@looly
Copy link
Member

looly commented Oct 24, 2024

@dddddkkkkk 感谢提供的解决思路。貌似第三方的openJDK都没有这个校验。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests