BouncyCastle Cryptography提供程序库,与Java 7u40上的applet一起使用

时间:2013-09-26 13:24:11

标签: applet code-signing bouncycastle jarsigner

案例:我正在维护一个Java applet,它使用BouncyCastle库 bcpkix-jdk15on-149.jar bcprov-jdk15on-149.jar

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

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

据我所知,这是因为BC库是使用由“JCE Code Signing CA”颁发的BouncyCastle证书签名的。 因此,lib可以执行并充当加密提供程序。

但是:JRE无法构建证书链以信任签名。它显示“提供者:UNKNOWN”

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

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

我是对的吗? 我该怎么办?
PS:我搜索了很多东西来找到JCA根证书(将它放入JRE信任库),没有成功......有没有办法获取根CA?

2 个答案:

答案 0 :(得分:22)

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

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

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

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

这是jarsigner命令的魔术参数,可以添加并实现它:    -digestalg SHA1

示例命令:

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

......你已经完成了!

以下帖子给了我提示:What prevents Java from verifying signed jars with multiple signature algorithms

答案 1 :(得分:0)

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

放线: Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());

帮助我摆脱异常。

来源: jce cannot authenticate the provider bc