JCE无法在java swing应用程序中验证提供程序BC
我正在用Java创建一个基于swing的应用程序,它使用一些加密技术。但是 getInstance(“AES”、“BC”)给出了异常:JCE无法在java swing应用程序中验证提供程序BC,java,encryption,Java,Encryption,我正在用Java创建一个基于swing的应用程序,它使用一些加密技术。但是 getInstance(“AES”、“BC”)给出了异常: java.security.NoSuchProviderException: JCE cannot authenticate the provider BC at javax.crypto.SunJCE_b.a(DashoA13*..) at javax.crypto.KeyGenerator.getInstance(DashoA
java.security.NoSuchProviderException: JCE cannot authenticate the provider BC
at javax.crypto.SunJCE_b.a(DashoA13*..)
at javax.crypto.KeyGenerator.getInstance(DashoA13*..)
那么问题出在哪里呢?要扩展GregS的评论,所有JCE提供程序JAR必须先签名,然后才能被Java运行时信任 BouncyCastle尽职尽责地提供可正常工作的签名罐。但是,如果您从这个JAR中提取类文件,或者重新编译源代码,它将删除签名并导致Java拒绝代码 见本相关问题:
jre\lib\security\java.security
security.provider.10=org.bouncycastle.jce.provider.BouncyCastleProvider
bc*.jar
复制到jre\lib\ext
对于那些发现这个问题但实际使用
SpongyCastle
的人来说,知道Android上没有这样的签名测试可能很有趣,对于您的测试,您可以通过openJDK-8使用SpongyCastle,因为它也不关心签名
作为参考,使用SpongyCastle,错误如下:
java.lang.SecurityException: JCE cannot authenticate the provider SC
更多信息请参见对于我来说,问题是
bcprov-ext-jdk16。jar
被sbt程序集
丢弃
[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
,如下所示
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\u 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
仅供参考:下面的步骤并没有修改java.security并将jar复制到\jre\lib\ext,而是解决了我的问题
几个星期以来,我们一直在为同一问题苦恼,并尝试了许多建议的步骤,但都无济于事。在下面提供我们的解决方案,这样其他人就不必像我们那样受苦了 我们试图使用bcprov-ext-jdk15on-162.jar,它被添加到类路径中,包含在JBoss lib目录中,与WAR捆绑在一起,标记为提供并添加到JBoss/lib目录中,但没有成功 最后,我们尝试了不同版本的bouncycastle,发现了一个较新的版本,该版本的签名可以通过特定Java版本的jarsigner(1.5X)进行验证 尽管jar的签名可以通过我们的Java版本进行验证,但当.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版本,并且确信我们的战争并没有将其打包,我们就成了黄金
这个问题似乎与您正在使用的Java/JBoss版本紧密相关。因此,如果此解决方案不适用于您,我建议您使用测试不同版本的bouncycastle
jarsigner -verify <bouncycastle.jar>
jarsigner-验证
这个问题有很多解决方案,但不幸的是,没有人谈论导致问题的原因
如果您正在生成一个包含BC.jar的可执行jar(以任何依赖项的形式),那么如果以下条件匹配,则会出现此问题:
就是这样。这通常意味着类/jar和/或类路径的打包有问题。你不能从他们的jar中提取BC类并将它们放在另一个jar中。检查你的类路径,也许你有几个不同版本的BouncyCastle jar,就像我遇到的一样。这对我来说非常有用!我使用的是jython,尽管我直接指定了jar文件(没有单独提取类文件),但我得到了异常声明。可能是jython提取的。很好的解决方案。谢谢它对我不起作用?我做了这两个步骤;然而,我不断地得到这个错误。有关更多信息,请提供任何帮助:
bc*.jar
表示可以从web下载的BouncyCastle的jar文件。对我来说,这是bcprov-jdk15-140.jar
还需要做什么?例如重启Java应用程序或重启操作系统?我没有提取或重新编译jar文件,我只是从中下载bcprov-jdk14和bcpkix-jdk14;但是,它对我不起作用!使用OpenJDK。它不需要对JCE提供程序进行签名。我尝试了这种方法,但没有成功。我认为原因是若你们在其他项目中使用jar。BC prov错误与相同问题一起出现。