【问题标题】:JCE cannot authenticate the provider BC in java swing applicationJCE 无法在 java swing 应用程序中验证提供者 BC
【发布时间】:2012-11-23 04:21:01
【问题描述】:

我正在使用某种加密技术在 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*..)

那么问题出在哪里?

【问题讨论】:

  • 这通常意味着您在打包类/jar 和/或类路径时做错了。你不能从他们的 jar 中提取 BC 类并将它们放在另一个 jar 中。
  • 检查你的类路径,也许你有几个不同版本的 BouncyCastle JAR,就像发生在我身上一样。

标签: java encryption


【解决方案1】:
  1. 编辑jre\lib\security\java.security
  2. 添加security.provider.10=org.bouncycastle.jce.provider.BouncyCastleProvider
  3. bc*.jar复制到jre\lib\ext

【讨论】:

  • 这对我很有用!我正在使用 jython,即使我直接指定了 jar 文件(没有单独提取类文件),我也得到了异常声明。可能是 jython 提取它。很好的解决方案。谢谢!
  • 它对我不起作用?我做了这两个步骤;但是,我不断收到此错误。请提供任何帮助
  • 更多信息:bc*.jar 表示 BouncyCastle 的 jar 文件,可以从网上下载。对我来说,它是bcprov-jdk15-140.jar
  • 还有什么需要做的吗?例如重启 Java App 或重启操作系统?
  • 按照上述步骤操作,对我来说效果很好。此外,我取消了 java.security=unlimited 行的注释。我使用的是 JRE 版本“1.8.0_271”。
【解决方案2】:

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

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

查看这个相关的 SO 问题:How to sign a custom JCE security provider

【讨论】:

  • 我没有解压或重新编译jar文件,我只从repo2.maven.org/maven2/org/bouncycastle下载了bcprov-jdk14和bcpkix-jdk14;但是,它对我不起作用!
  • 使用 OpenJDK。它不需要对 JCE 提供者进行签名。
【解决方案3】:

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

作为参考,对于 SpongyCastle,错误显示为:

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

更多信息在this issue

【讨论】:

    【解决方案4】:

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

    我们尝试使用 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>
    

    【讨论】:

      【解决方案5】:

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

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

      1. 通过 Eclipse 的导出选项生成 jar,即导出-> 可运行的 Jar 文件 -> 库处理 {将所需的库提取到生成的 Jar}-> 完成

      Boom,现在你遇到了麻烦,你将面临一个错误,即 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

      就是这样。

      【讨论】:

        【解决方案6】:

        对我来说,问题是 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.jarfrom -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
        

        【讨论】:

          【解决方案7】:

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

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

          【讨论】:

          • 我尝试过这种方法,但对我不起作用。我认为原因是如果您在其他项目中使用 jar。 BC prov 错误在那里发生同样的问题。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多