我该如何使用Maven安装JCE无限制权限策略文件?

22

我手头的一些代码需要JCE无限强度策略文件。我想把这个依赖项加入到Maven的Pom文件中,这样我的团队中的其他开发人员就不必在各自的系统上单独应用它了。

我知道最终部署到的系统需要手动安装JCE文件。这只是一个开发解决方案。

我想把策略文件添加到我们的仓库中,然后让Maven来处理安装,但我很惊讶地发现没有看到其他人这样做(并写博客分享)。

3个回答

15

我发现了一个答案,当在Google上搜索Maven依赖项以获取策略JAR时,意识到这是与JRE安装特定相关的。因此,在Maven构建中修复它只适用于开发人员,并且只有在您拥有/jre/lib/security文件夹的权限时才能起作用。对我来说,以下代码hack效果要好得多(将其作为应用程序执行的最初步骤之一调用):

    try {
        Field field = Class.forName("javax.crypto.JceSecurity").getDeclaredField("isRestricted");
        field.setAccessible(true);
        field.set(null, java.lang.Boolean.FALSE);
    } catch (ClassNotFoundException | NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException ex) {
        ex.printStackTrace(System.err);
    }

谢谢Bart,这个答案节省了我的时间。 - shashaDenovo
嗨,巴特,由于Java1.8的更新,这个解决方案停止工作了。您知道是否有类似的技巧适用于Java1.8吗? - shashaDenovo
嗨,我在OSX上使用Java 1.8.0_25,它仍然可以工作。 - Marcel
这是因为javax.crypto.JceSecurity.isRestricted变成了final。https://bugs.openjdk.java.net/browse/JDK-8149417 - Hard Worker
1
@shashaDenovo,这个帖子中有Andrey Karayvansky为Java 1.8提供的新解决方案。 - notes-jj

11

Java 8 安全漏洞

    // hack for JCE Unlimited Strength
    Field field = Class.forName("javax.crypto.JceSecurity").getDeclaredField("isRestricted");
    field.setAccessible(true);

    Field modifiersField = Field.class.getDeclaredField("modifiers");
    modifiersField.setAccessible(true);
    modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);

    field.set(null, false);

我正在使用java 1.8.0_102,但它对我不起作用 :( - Max Peng

6
您可以尝试以下方法:
  • 将JCE无限制权限策略文件捆绑成zip格式。
  • 将其作为zip依赖项安装到公司存储库中。
  • 使用dependency:unpack目标,在构建过程中将创建的依赖项解压缩到${java.home}/jre/lib/security,例如在initialize期间(请参见Unpacking specific artifacts)。

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