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

时间:2015-08-27 02:44:56

标签: java ssl cryptography cryptoapi elliptic-curve

我正在尝试直接从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 supports only RSA, ECDH support planned for v3 next year.

更新:有人建议安装Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files for Java 8也许可以解决这个问题,但是没有,这没有用,因为问题是SunMSCAPI只支持RSA密码,可以看到{{3 }}

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

specification

  

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

     

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

     

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

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

答案 2 :(得分:0)

下一代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。