前言
- 上篇文章我写了关于:Gradle 8.11.1的升级之旅
- 在上次升级之后,这次为了合规,我引入了SM2加密库bcprov,出乎意料的第一步就失败了,搞了好几天才搞定
1. SHA-256 digest error for org/bouncycastle/LICENSE.class
我查看了下官网的Issues,有个4天前给的方案,链接是:github.com/HuolalaTech...
官方提供的2种解决方案:
-
方案1:如果使用
1.3.x
版本,可以编译期配置forceIncremental = false;
,需要注意保存好编译缓存目录。 -
方案2:(只针对特殊情况)如果使用
1.3.0-rc6
及之后的版本,可以直接配置removeClass = ["org/bouncycastle/LICENSE.class"];
过滤掉无用类
我查看了下,最新的TheRouter的版本是1.3.0-rc6,于是我就升级到最新版本,然后在build.gradle下添加代码
ini
TheRouter {
removeClass = [
"org/bouncycastle/**", // 排除整个包
]
}
但是很不幸,马上遇到了第二个错误
2. java.lang.SecurityException: SHA-256 digest error for org/bouncycastle/cert/bc/BcX509ExtensionUtils$1.class
- 我尝试移除所有签名
ruby
TheRouter {
removeClass = [
"org/bouncycastle/**", // 移除 BouncyCastle 所有 class
"META-INF/*.SF", // 清理签名文件
"META-INF/*.RSA",
"META-INF/*.DSA"
]
}
运行还是不行,于是我尝试强制排除BC 依赖
csharp
configurations.all {
exclude group: 'org.bouncycastle'
}
然后我就发现我加密库找不到包了😂,我以为是我的版本不是最新导致的,我的版本是1.71
arduino
implementation 'org.bouncycastle:bcprov-jdk15to18:1.71'
我就升级到最新版本1.81失败,降级到1.68失败
最终解决办法
- 它不是说签名有问题吗?那我就干掉签名不就好了
- 于是我就将jar包导出,导出方法如下,找到对应的jar包,右击选择Open in->Finder
移除签名
- 解压 jar 包
bash
mkdir temp_jar
cd temp_jar
jar xf ../your-original.jar
- 删除
META-INF
中的签名文件
bash
rm META-INF/*.SF META-INF/*.DSA
我不确定最新版本的有没有RSA,如果有大家对应删除就好了
bash
rm META-INF/*.SF META-INF/*.RSA META-INF/*.DSA
注意 :不要删掉 MANIFEST.MF
,不要删掉 MANIFEST.MF
,不要删掉 `MANIFEST.MF。
我第一次傻乎乎的全删了,然后加密工具找不到了源码了~
- 重新打包成新的无签名 jar
arduino
jar cf ../your-unsigned.jar *
- your-unsigned:你自己随便起名字,这个看你自己,假设就叫bouncycastle.jar
- 移除gradle依赖的bouncycastle,将没有签名的bouncycastle.jar包放到libs重新构建
这里有个注意的细节,我刚才不是将theRouter升级到1.3.0-rc6了吗,这里一定要改回1.3.0-rc4,因为最新版本我这边疯狂失败,说是空指针异常,当然你如果不失败那是最完美的