1

精简版:

是否需要向 OpenJDK JRE 添加策略才能java.policy在 IcedTea-Web 的默认安装中使用 JCE 加密库?是某种错误吗??

长版:

我通过 WebStart 加载了这个 Swing 应用程序,我试图将它与 OpenJDK8(RedHat、AdoptOpenJDK 或 Coretto 变体)+ IcedTea WebStart(从这里下载)一起使用。我的 Swing 应用程序中的所有内容都可以工作,但只有一个面板。

我将一些加密文本存储在某处,然后使用以下方法将其解密以显示在 TextField 中:

public synchronized static String decrypt(String toDecrypt, byte[] key) {
    Key keySpec = new SecretKeySpec(key, "AES");
    try {
        CIPHER.init(Cipher.DECRYPT_MODE, keySpec);
        return new String(CIPHER.doFinal(toBytes(toDecrypt)));
    }
    catch (Exception e) {
        throw new RuntimeException(e);
    }
}

完成此过程的面板在加载时解密,并且无法加载 RedHat OpenJDK(我认为是 v1.7)中包含的 IcedTea-web,并显示错误消息:

 at javax.crypto.Cipher.getInstance(Cipher.java:539)  Caused by: java.security.NoSuchAlgorithmException: Cannot find any provider supporting AES 
    ... 45 more 
    Caused by: java.lang.RuntimeException: java.security.NoSuchAlgorithmException: Cannot find any provider supporting AES 
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

我在OpenJDK 的 Linux 和 Windows 安装上尝试了这个答案中的代码,它说可用的提供程序有所不同。

对于 Windows:

  • SunPCSC 1.8 版
  • XMLDSig 1.8 版
  • SunSASL 1.8 版
  • SunJGSS 1.8 版
  • SunJSSE 1.8 版
  • SunEC 1.8 版
  • SunRsaSign 1.8 版
  • 太阳版本 1.8

对于 Linux:

  • 太阳版本 1.8
  • SunRsaSign 1.8 版
  • SunEC 1.8 版
  • SunJSSE 1.8 版
  • SunJCE 1.8 版
  • SunJGSS 1.8 版
  • SunSASL 1.8 版
  • XMLDSig 1.8 版
  • SunPCSC 1.8 版

所以,它似乎缺少 JCE。

我尝试了最后一个可用的 IcedTeaWeb (v1.8),它们都默认配置了完整的提供程序列表:

security.provider.1=sun.security.provider.Sun
security.provider.2=sun.security.rsa.SunRsaSign
security.provider.3=sun.security.ec.SunEC
security.provider.4=com.sun.net.ssl.internal.ssl.Provider
security.provider.5=com.sun.crypto.provider.SunJCE
security.provider.6=sun.security.jgss.SunProvider
security.provider.7=com.sun.security.sasl.Provider
security.provider.8=org.jcp.xml.dsig.internal.dom.XMLDSigRI
security.provider.9=sun.security.smartcardio.SunPCSC
security.provider.10=sun.security.mscapi.SunMSCAPI

安全政策也是无限的

# Note: This property is currently used by the JDK Reference implementation.
# It is not guaranteed to be examined and used by other implementations.
#
crypto.policy=unlimited

但是他们似乎缺乏 WebStart 的权限,因为我可以解密并打开从 IntelliJ 运行应用程序的面板(没有 WebStart 环境)。

最后,仅在最后一个 IcedTea-WebStart 版本(v1.8)上,我在加载面板时收到了额外的错误消息:

Denying permission: ("java.lang.RuntimePermission" "loadLibrary.sunmscapi")
Denying permission: ("java.security.SecurityPermission" "putProviderProperty.SunJCE")

它导致我尝试添加权限java.policy

permission java.security.SecurityPermission "putProviderProperty.SunJCE";
permission java.lang.RuntimePermission "accessClassInPackage.sun.security.internal.spec";
permission java.lang.RuntimePermission "accessClassInPackage.sun.security.rsa";
permission java.lang.RuntimePermission "accessClassInPackage.sun.security.internal.interfaces";
permission java.lang.RuntimePermission "accessClassInPackage.sun.security.util";

这样,我的应用程序终于可以正常工作了。但是,由于这在任何地方都没有记录,以这种方式配置它是否正确?我是否设置了不安全的配置?这是应该在 OpenJDK 中修复的吗?谢谢。

4

0 回答 0