精简版:
是否需要向 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 中修复的吗?谢谢。