繁体   English   中英

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

[英]How to load Next Generation certificates from the Microsoft keystore using Java 8?

我正在尝试直接从Microsoft商店加载证书,以避免必须从MS商店导出证书,然后将它们导入JKS商店。

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

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

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

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

还有其他现成的JCE提供商替代SunMSCAPI可以处理我可以尝试的CNG吗?

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

更新:有人建议为Java 8安装Java Cryptography Extension(JCE)Unlimited Strength Jurisdiction Policy Files也许可以解决这个问题,但是没有,这没有帮助,因为问题是SunMSCAPI仅支持RSA密码,可以看出看源代码

如前所述,SunMSCAPI尚未实现这一点。 实际上有一个增强请求打开,人们可以投票支持修复问题。

问题在这里: https//bugs.openjdk.java.net/browse/JDK-8026953

规范说明

由于某些国家/地区的导入法规,Oracle实施提供了默认的加密管辖区域策略文件,该文件限制了加密算法的强度。

如果需要更强大的算法(例如,具有256位密钥的AES),则必须获取JCE Unlimited Strength Jurisdiction Policy Files并将其安装在JDK / JRE中。

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

下载JCE Unlimited Strength Jurisdiction Policy Files并将其放入jre安全文件夹中。

下一代api没有在sunmscapi c ++代码中实现 - 文件security.cpp - ,它与windows crypto api交互。 EC也没有在sunmscapi的java代码中实现。

你可以在这里查看openJDK的源代码: http ://hg.openjdk.java.net/jdk8u/jdk8u/jdk/file/556b17038b5c/src/windows/native/sun/security/mscapi/security.cpp

当您从Java代码调用keystore.load(null,null)时,它最终会以c ++代码函数Java_sun_security_mscapi_KeyStore_loadKeysOrCertificateChains结束。 第383行CryptAcquireCertificatePrivateKey返回false,因为它没有使用CRYPT_ACQUIRE_ALLOW_NCRYPT_KEY_FLAG标志。 即使你修复了那条线,它最终也会崩溃。 因为它使用旧的加密api函数。

让它工作意味着使用新的下一代加密api自行重写所有sunmscapi。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM