如何安装无限制强度的权限策略文件?

12

请问有人能够解释一下如何安装无限制强度的权限策略文件吗?我从Oracle网站下载了.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)

尝试通过网络搜索来寻找你问题的标题。另外,阅读你下载的压缩文件中的README文件。如果没有进行研究,请点“踩”。 - Andreas
1
你是如何“安装”它们的? - assylias
相关链接:https://dev59.com/HW865IYBdhLWcg3wWtKz - Mark Rotteveel
我安装了Java JDK1.8.0_301,而不是试图更改我的当前JDK。这为我解决了问题,因为安全文件已经在那里更新了... - Andre Nel
6个回答

23

2018-01-15 更新

根据JDK-8170157,自 JDK 6u181, 7u171, 8u161, 9b148 起,默认启用无限的加密策略。因此,您只需升级到相应版本即可。

原始回答

Java 9Java 8u151以来,不再需要下载和手动安装策略文件。根据发行说明

在旧版本中,必须单独下载和安装JCE策略文件才能让JDK使用无限制的加密。现在不再需要下载和安装步骤。要启用无限制的加密,可以使用新的crypto.policy安全属性。如果该属性已在java.security文件中设置或在初始化JCE框架之前使用Security.setProperty()动态设置了该属性,则会遵循该设置。默认情况下,该属性未定义。如果该属性未定义且旧版JCE策略文件不存在于旧版lib/security目录中,则默认的加密级别将保持为有限制的。要配置JDK使用无限制的加密,请将crypto.policy设置为unlimited。有关更多信息,请参阅随此版本一起发布的java.security文件中的说明。


9
你需要确定你的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
  • *nix操作系统下: /usr/java/jdk1.8.0_101/bin/java
然后,你需要将你下载的US_export_policy.jarlocal_policy.jar文件复制到目录: <JAVA_HOME>/jre/lib/security 中,并覆盖同名的现有文件。 更新于05/17/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());
  }
}

1
如果您想使您的应用程序具有可移植性,并将它们作为库带入,是否有任何解决方案呢 :) ? - GOXR3PLUS
有一些脆弱的JVM反射黑客方式可以覆盖安全检查,或者你可以将它们捆绑在一个安装程序包中,然后安装到用户的JRE主目录(这可能违反了Oracle的服务条款,我不确定)。如果你希望你的应用程序真正具备可移植性,就不要依赖于无限制强度策略的存在。目前来说,AES-128仍然足够强大。 - Andy
很遗憾,这并不足以满足我想要的目的http://stackoverflow.com/questions/44031398/fetching-data-from-httpurlconnection-as-text-throws-javax-net-ssl-sslhandshakeex ,我需要“256位对称密码”。 - GOXR3PLUS
你可以黑进JVM,让它相信自己可以访问256位密码。完整免责声明:此代码仅用于演示目的;我不建议您这样做(请参见更新后的答案)。 - Andy
非常感谢您的努力。我正在使用Java 1.8.0_121,但它无法工作。我是说,如果您尝试从我的问题链接中使用代码,它会产生相同的错误。似乎“Java 8 Update 121”不允许反射黑客。我唯一看到的希望是使用Java 9。 - GOXR3PLUS
这个答案在我处理区块链时帮了我很多。谢谢。 - Arefe

1

我曾经遇到同样的问题,但以上回答都没有解决我的问题。所以当我找到解决方案后,我决定在这里分享,以帮助其他人。

最终对我有用的方法是从Oracle网站下载无限制权限策略文件

解压文件夹并将文件夹内的文件移动到$JAVA_HOME\jre\lib\security中,覆盖已有相同名称的文件。

请将JAVA_HOME替换为您的Java安装的实际jdk文件夹。


对我来说,文件已经存在,但仍然无法工作,按照您的建议替换文件帮助我解决了问题。 - TechnoCrat

0
在 $JAVA_HOME/jre/lib/security 目录下,编辑 java.security 文件并取消注释 crypto.policy=unlimited 这一行(该行大约在 932 行文件中的第 823 行)。

我在我的文件中没有这个条目。 - kdas

-1

对于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;
    }
}

-2
为了以编程方式处理这个问题,以下 Scala 代码可以帮助您完成。上面给出的代码在 Java 版本 8 中无法工作。你会遇到一个错误。 错误: 无法将 javax.crypto.JceSecurity 的静态 final boolean 字段 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
  }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接