44

在处理另一个问题(与 RMI 相关)时,我使用“无限强度”策略文件升级了系统的“安全文件夹”,现在我的应用程序以不同的方式失败。我得到一个长堆栈转储,其中以下位似乎相关:

Exception in thread "main" java.lang.ExceptionInInitializerError

[...crop...]

Caused by: java.lang.SecurityException: Can not initialize cryptographic mechanism
        at javax.crypto.JceSecurity.<clinit>(JceSecurity.java:86)
        ... 17 more
Caused by: java.lang.SecurityException: The jurisdiction policy files are not signed by a trusted signer!

[...crop...]

嗯,WTF?唯一的变化是我将原始 jar 文件移到一边,并在 $JAVA_HOME/lib/security.xml 中添加了无限制的 jar 文件。该目录现在如下所示:

$ ls
blacklist      javaws.policy               trusted.libraries
cacerts        local_policy.jar            US_export_policy.jar
java.policy    local_policy.jar.strong     US_export_policy.jar.strong
java.security  local_policy.jar.unlimited  US_export_policy.jar.unlimited

当然,还有 .strong 和 .unlimited 版本,所以我可以快速切换回来。

说明简短明了,看起来他们只设想替换这两个文件(local_policy.jar 和 US_exportpolicy.jar)。

还需要做什么?

请注意,java 和策略文件的版本是迄今为止最年轻的版本:分别为 1.7.0_03 和 jce_policy-6。

PS 在此处找到的类似标题的文章根本没有帮助。

4

5 回答 5

52

您应该使用Java 7 的策略文件,而不是混合运行时和策略文件版本。

于 2012-03-16T22:31:25.563 回答
18

当 Java 版本与策略文件的版本不匹配时,就会发生这种情况。您可以从以下链接下载相关政策文件。

Java 8
的策略 jar Java 7
的策略 jar Java 6 的策略 jar

于 2013-07-17T12:45:01.210 回答
8

您可能有不同版本的 JDK。例如,如果您的 JAVA_HOME 指向版本 7,但在您的路径中版本 6 出现在版本 7 之前,则可能会弹出此错误。

于 2016-04-21T08:56:53.633 回答
4

如果类路径中某处存在标准策略 jar 文件,则可能会发生这种情况。我建议在您的机器中使用这些 jar 的无限制版本查找并替换所有 local_policy.jar 和 us_export_policy.jar 文件。如果您使用 IBM 的 WAS/Portal Server/RAD,这里是不受限制的 JCE 策略jars的链接。

于 2014-09-16T15:56:51.883 回答
0

在更改本地或服务器中的版本时,您应该将原始 jre/lib/security 文件夹复制为 security8 并删除引用 efs 的 cacerts,而不是从旧的 security8 复制。这对我有用。

于 2021-11-16T20:31:42.800 回答