30

我正在使用一些加密技术在 Java 中创建一个基于 swing 的应用程序。但是 javax.crypto.KeyGenerator.getInstance("AES", "BC") 给出了异常:

java.security.NoSuchProviderException: JCE cannot authenticate the provider BC
        at javax.crypto.SunJCE_b.a(DashoA13*..)
        at javax.crypto.KeyGenerator.getInstance(DashoA13*..)

那么问题是什么?

4

7 回答 7

50
  1. 编辑jre\lib\security\java.security
  2. 添加security.provider.10=org.bouncycastle.jce.provider.BouncyCastleProvider
  3. 复制bc*.jarjre\lib\ext
于 2013-10-24T09:32:58.053 回答
27

为了扩展 GregS 的评论,所有 JCE 提供者 JAR 必须先签名,然后才能被您的 Java 运行时信任。

BouncyCastle 尽职尽责地提供可以正常工作的签名 JAR。但是,如果您从该 JAR 中提取类文件,或重新编译源代码,则会删除签名并导致 Java 拒绝该代码。

请参阅这个相关的 SO 问题:How to sign a custom JCE security provider

于 2012-12-05T15:24:32.493 回答
3

对于那些发现这个问题但实际使用SpongyCastle的人来说,知道在 Android 上没有这样的签名测试可能会很有趣,并且对于您的测试,您可以通过 openJDK-8 使用 SpongyCastle,因为它也不关心签名。

作为参考,使用 SpongyCastle 时,错误显示为:

java.lang.SecurityException: JCE cannot authenticate the provider SC

本期更多信息

于 2016-06-10T03:43:14.463 回答
1

几周以来,我们一直在遭受同样的问题困扰,并且尝试了很多建议的步骤均无济于事。在下面提供我们的解决方案,这样其他人就不必像我们一样受苦了!

我们试图使用 bcprov-ext-jdk15on-162.jar,添加到类路径,包含在 JBoss lib 目录中,与 WAR 捆绑,标记为已提供并添加到 JBoss /lib 目录,但没有运气。

最后,我们尝试了不同版本的 bouncycastle,发现了一个较新的版本,其签名可以通过我们特定的 Java 版本的 jarsigner (1.5X) 进行验证。

尽管我们的 Java 版本可以验证 jar 的签名,但当 .jar 被打包到 WAR 中时,JBoss 以某种方式使签名无效。

最后,我们的解决方案是;

1. Add bouncycastle jar to JBoss classpath
2. Add 'org.bouncycastle.jce.provider.BouncyCastleProvider' to 'java.security' providers
3. Mark bouncycastle in your WAR as a 'provided' dependency

一旦我们在类路径中有一个版本的 .jar 并且确定我们的 WAR 没有将它打包进去,我们就很成功了。

这个问题似乎与您碰巧使用的 Java/JBoss 版本紧密相关。因此,如果此解决方案对您不起作用,我建议您测试不同版本的 bouncycastle

jarsigner -verify <bouncycastle.jar>
于 2019-08-29T10:38:09.087 回答
1

这个问题有很多解决方案,但不幸的是没有人谈论导致问题的原因。

如果您正在生成一个包含 BC.jar 的可执行 jar(以任何依赖项的形式),那么如果以下条件匹配,则会出现此问题:

  1. 通过 eclipse 的导出选项生成 jar 即 Export-> Runnable Jar File -> Libary handling {extract required libraries into generated Jar}-> FINISH

繁荣,现在你遇到了麻烦,你将面临一个错误,即JCE 无法验证提供者 BC

上述问题的原因是,当您使用选项 1 创建一个 jar 时,实际上是在再次解压 BouncyCastle jar,这违反了与 BC 相关的安全性。因此,每当您再次运行它时,java 都会对其进行验证,并在您的关联 jar 中发现当前的 BC.jar 有错误。

所以,伙计们要确保你所做的事情是合理的,因为通过更改 JDK 的安全数据,这将使它工作,但并不适合所有人。

如何使它工作?{这将只在本地/个人机器上工作,而不是在每台机器上}

  1. 编辑 jre\lib\security\java.security 文件
  2. 添加 security.provider.10=org.bouncycastle.jce.provider.BouncyCastleProvider
  3. 将 bc*.jar 复制到 jre\lib\ext

就是这样。

于 2019-12-31T09:01:40.057 回答
0

对我来说,这个问题bcprov-ext-jdk16.jarsbt assembly.

[warn] Merging 'META-INF/license/LICENSE.bouncycastle.txt' with strategy 'discard'
..
[warn] Merging 'META-INF/maven/org.jasypt/jasypt/pom.properties' with strategy 'discard'
[warn] Merging 'META-INF/maven/org.jasypt/jasypt/pom.xml' with strategy 'discard'
..

所以我最终使用了bouncycastle.jar from-classpath如下,

java -Denvironment=dev -cp chat-server.jar:/Users/prayagupd/.ivy2/cache/org.bouncycastle/bcprov-ext-jdk16/jars/bcprov-ext-jdk16-1.46.jar com.chat.server.ChatServer

也可以将 bouncycastle.jar 放到$JAVA_HOME/jre/lib/ext,

cp /Users/prayagupd/.ivy2/cache/org.bouncycastle/bcprov-ext-jdk16/jars/bcprov-ext-jdk16-1.46.jar $JAVA_HOME/jre/lib/ext/

$ ls -l $JAVA_HOME/jre/lib/ext/
total 55208
-rw-r--r--  1 root  wheel   1887089 May  7 21:22 bcprov-ext-jdk16-1.46.jar
-rw-rw-r--  1 root  wheel   3860502 Sep  5  2017 cldrdata.jar
-rw-rw-r--  1 root  wheel      8286 Sep  5  2017 dnsns.jar
-rw-rw-r--  1 root  wheel     44516 Sep  5  2017 jaccess.jar
-rwxrwxr-x  1 root  wheel  18610276 Sep  5  2017 jfxrt.jar
-rw-rw-r--  1 root  wheel   1179093 Sep  5  2017 localedata.jar
-rw-rw-r--  1 root  wheel      1269 Sep  5  2017 meta-index
-rw-rw-r--  1 root  wheel   2022735 Sep  5  2017 nashorn.jar
-rw-rw-r--  1 root  wheel     41672 Sep  5  2017 sunec.jar
-rw-rw-r--  1 root  wheel    274148 Sep  5  2017 sunjce_provider.jar
-rw-rw-r--  1 root  wheel    248726 Sep  5  2017 sunpkcs11.jar
-rw-rw-r--  1 root  wheel     68924 Sep  5  2017 zipfs.jar
于 2018-05-08T05:16:55.427 回答
0

仅供参考:下面的步骤也解决了我的问题,而不是修改 java.security 并将 jar 复制到 \jre\lib\ext。

  1. 在您的班级中添加 Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider()) 。
  2. 将提供的范围添加到 pom.xml 中的 bcprov.*.jar 依赖项。
  3. 将 bcprov.*.jar 放入您的特定文件夹(例如:\lib),然后在运行项目时引用它。
于 2018-06-12T09:11:27.213 回答