19

案例:我正在维护一个使用 BouncyCastle 库bcpkix-jdk15on-149.jarbcprov-jdk15on-149.jar的 Java 小程序。

问题是当小程序在支持 JRE 版本 7_u40 的浏览器上运行时。
该行为已从版本 7_u25 更改为它始终提示一个模式窗口,例如“使用自签名证书的应用程序的安全提示”(不能再永久隐藏),只是为了信任bcprov

https://www.java.com/en/download/help/appsecuritydialogs.xml

据我所知,这是因为 BC 库使用由“JCE 代码签名 CA”颁发的 BouncyCastle 证书进行签名。因此,该库可以执行和充当密码提供者。

但是:JRE 无法建立证书链来信任签名。它显示“提供者:未知”

我知道我可以删除该签名并自己签名(我拥有 Thawte 代码签名证书):

  • 它适用于 bcpkix 库
  • 它不适用于bcprov,因为它不会被视为有效的密码学提供程序(JRE 不会信任它)。

我对吗?我能做些什么?
PS:我搜索了很多以找到 JCA 根证书(将其放入 JRE 信任库),但没有成功……有没有办法获取该根 CA?

4

2 回答 2

22

经过大量搜索并在 BC 邮件列表中发布了一些帖子......我找到了解决方案,所以我将它放在这里以供可能面临该问题的其他人使用:

解决方案基本上是用我自己的证书第二次签署 BC 库。
JAR 需要 JCA 签名才能被信任为加密提供者,因此不要删除它。
JAR 还需要(另外)一个代码签名,以便能够在 JVM(受 JRE 信任)中运行。

最后一件事,签名技术发生了一些不兼容:

  • BC lib 使用 SHA1 摘要算法签名
  • jarsigner(在我的电脑上)默认使用 SHA256 摘要算法进行签名,这会导致验证失败。
  • 所以我不得不让 jarsigner 以 SHA1 的方式来做。(出于某种原因,从这个角度来看,两个签名都必须是一致的)

这是 jarsigner 命令的神奇参数,用于添加并使其发生: -digestalg SHA1

示例命令:

jarsigner -keystore ./mykeystore.jks -storepass myPass -digestalg SHA1 bcprov-jdk15on-149.jar myAlias

......你就完成了!

下面的帖子给了我提示:是什么阻止了 Java 验证具有多个签名算法的签名 jars

于 2013-09-27T11:54:14.097 回答
0

我们还可以包括其他 stackoverflow 帖子和对我有帮助的答案:

把这条线: Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());

帮助我摆脱了异常。

来源: jce 无法验证提供者 bc

于 2015-12-03T16:53:27.500 回答