如何安装Unlimited Strength Jurisdiction Policy Files?

时间:2017-01-10 23:48:41

标签: java maven jar

有人可以向我解释如何安装Unlimited Strength Jurisdiction Policy Files。我从Oracle website下载了.jar文件,但我遇到了安装它们的问题。我正在制作的Java程序一直给我这个错误:

Jan 11, 2017 12:32:31 AM com.subgraph.orchid.TorClient start
INFO: Starting Orchid (version: 1.0.0)
Jan 11, 2017 12:32:31 AM com.subgraph.orchid.TorClient verifyUnlimitedStrengthPolicyInstalled
SEVERE: Unlimited Strength Jurisdiction Policy Files are required but not installed.
Exception in thread "main" com.subgraph.orchid.TorException: Unlimited Strength Jurisdiction Policy Files are required but not installed.
    at com.subgraph.orchid.TorClient.verifyUnlimitedStrengthPolicyInstalled(TorClient.java:208)
    at com.subgraph.orchid.TorClient.start(TorClient.java:79)
    at com.nikola.WebCrawlerApp.App$OrchidDemo.startOrchid(App.java:46)
    at com.nikola.WebCrawlerApp.App$OrchidDemo.access$000(App.java:38)
    at com.nikola.WebCrawlerApp.App.main(App.java:35)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)

6 个答案:

答案 0 :(得分:17)

2018-01-15更新

根据JDK-8170157,由于JDK 6u181,7u171,8u161,9b148 默认启用无限制加密策略。所以你要做的只是升级到相应的基线。

原始答案

由于 Java 9 Java 8u151 ,因此无需再下载和手动安装管辖区政策文件。根据{{​​3}}:

  

在旧版本中,必须单独下载和安装 JCE 管辖区文件,以允许 JDK 使用无限制的加密。不再需要下载和安装步骤。要启用无限制加密,可以使用新的crypto.policy安全属性。如果在 java.security 文件中设置了新的Security属性,或者在 JCE 框架初始化之前使用Security.setProperty()调用动态设置了该属性,该设置将受到尊重。默认情况下,该属性将是未定义的。如果属性未定义且旧的 JCE 管辖区文件不存在于旧版 lib / security 目录中,则默认加密级别将保持有限。要将 JDK 配置为使用无限加密,请将crypto.policy设置为unlimited的值。有关详细信息,请参阅此版本随附的 java.security 文件中的说明。

答案 1 :(得分:6)

您需要确定Java主路径(通过Java中的System.getenv("JAVA_HOME")或命令行上的$ echo $JAVA_HOME)。它应该是如下的路径:

    Windows上的
  • C:\Program Files\Java\jre8
  • Mac OS X上的
  • /Library/Java/JavaVirtualMachines/jdk1.8.0_101.jdk/Contents/Home
  • /usr/java/jdk1.8.0_101/bin/java on * nix

然后,您需要将下载的US_export_policy.jarlocal_policy.jar文件复制到目录:<JAVA_HOME>/jre/lib/security并覆盖现有的同名文件。

2017年5月17日更新

以下代码(仅用于演示目的)将指示JVM允许其使用AES-256位加密和相应的TLS密码,而不管安装的策略文件如何。使用此方法不推荐

if (Cipher.getMaxAllowedKeyLength("AES") < 256) {
  try {
    Field field = Class.forName("javax.crypto.JceSecurity").
    getDeclaredField("isRestricted");
    field.setAccessible(true);
    field.set(null, java.lang.Boolean.FALSE);
  } catch (Exception e) {
    fail("Could not override JCE cryptography strength policy setting");
    fail(e.getMessage());
  }
}

答案 2 :(得分:1)

在$ JAVA_HOME / jre / lib / security中,编辑文件java.security并取消注释crypto.policy = unlimited(在932行文件中约为823行)。

答案 3 :(得分:0)

我有同样的问题,上述答案都没有对我有用,所以当我找到解决方案时,我决定在这里分享它以帮助其他人

最终对我有用的只是download the Unlimited Strength Jurisdiction Policy Files from oracle website

解压缩文件夹并将文件夹中的文件移入 $ JAVA_HOME \ jre \ lib \ security用相同的名称覆盖已存在的文件

将JAVA_HOME替换为java安装的实际jdk文件夹

答案 4 :(得分:0)

要以编程方式处理此问题,Scala中的以下代码将帮助您做到这一点。上面给出的代码不适用于Java版本8。您将得到一个错误。  错误: 不能将静态最终布尔字段javax.crypto.JceSecurity.isRestricted设置为java.lang.Boolean

if (Cipher.getMaxAllowedKeyLength("AES") < 256) {
 try {
 var field=Class.forName("javax.crypto.JceSecurity").getDeclaredField("isRestricted")
    field.setAccessible(true)
   var modifiersField = classOf[Field].getDeclaredField( "modifiers" )
   modifiersField.setAccessible(true);
   modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);
    field.set(null, java.lang.Boolean.FALSE)
  }

  catch{
    case ex:Exception=>throw ex
  }
}

答案 5 :(得分:0)

对于JDK 1.6,您可以通过以下方式进行操作:

private void hackJCE() throws Exception {
    try {
        if (Cipher.getMaxAllowedKeyLength("AES") < 256) {
            Field field = Class.forName("javax.crypto.SunJCE_b").
            getDeclaredField("g");
            field.setAccessible(true);
            field.set(null, false);
        }
    } catch (Exception e) {
        return;
    }
}