如何使用Java 8从Microsoft密钥库加载下一代证书?

我正在尝试直接从 Microsoft 存储加载证书,以避免必须从 MS 存储中导出证书,然后将其导入到 JKS 存储中。

我设法从典型的AD CS Web服务器模板创建证书,使用传统的加密直接从使用SunMSCAPI的MS存储中创建证书。

但是,SunMSCAPI不支持我正在使用的现代CNG密码,特别是RSA-2048非对称加密,SHA-384哈希和ECDSA-384数字签名。

是否可以使用 Java 从 MS 存储加载下一代证书?我在jdk1.8.0_45。有没有一个现成的JCE提供商可以替代SunMSCAPI来处理CNG?我怀疑它必须使用JNI或JNA来访问本机Windows CNG API。

我尝试过Pheox JCAPI但没有成功。它支持 RSA 和 DSA,但不支持 ECDSA。我没有尝试过充气城堡,但我的理解是它不提供这样的功能。

是否有其他现成的JCE提供商替代方案可以替代SunMSCAPI,我可以尝试处理CNG?

更新:JCAPI v2仅支持RSA,ECDH支持计划明年的v3。

更新:有些人建议为Java 8安装Java Cryptography Extension(JCE)Unlimited Strength管辖权策略文件也许可以解决这个问题,但是不,这没有帮助,因为问题是SunMSCAPI仅支持RSA密码,如查看源代码所示。


答案 1

如前所述,这在SunMSCAPI中(尚)是不可能的。实际上,有一个开放的增强请求,人们可以投票支持修复该问题。

此处的问题:https://bugs.openjdk.java.net/browse/JDK-8026953


答案 2

规范声明

由于某些国家/地区的进口法规,Oracle 实现提供了一个默认的加密管辖区策略文件,用于限制加密算法的强度。

如果需要更强大的算法(例如,具有 256 位密钥的 AES),则必须获取 JCE 无限强度管辖权策略文件并将其安装在 JDK/JRE 中。

用户有责任验证当地法规是否允许此操作。

下载JCE无限强度管辖权政策文件,并将其放在您的jre安全文件夹中。