我尝试直接从Microsoft存储加载证书,以避免从MS存储导出证书,然后将它们导入JKS存储。
我设法从一个典型的AD CS web服务器模板使用传统加密直接从MS商店使用SunMSCAPI创建证书。
但是,SunMSCAPI不支持我正在使用的现代CNG密码,特别是RSA2048非对称加密、SHA-384哈希和ECDSA-384数字签名。
是否可以使用Java从MS商店加载下一代证书?我上jdk1.8.0_45了。是否有现成的JCE提供程序可以替代SunMSCAPI来处理CNG?我怀疑它将不得不使用JNI或JNA来访问本机Windows CNG API。
我尝试过Pheox JCAPI,但没有成功。它支持RSA和DSA,但不支持ECDSA。我没有尝试过Bouncy Castle,但我的理解是它不提供这样的功能。
有没有其他现成的JCE提供程序替代SunMSCAPI,我可以尝试一下?
更新: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密码,从source code可以看出这一点。
发布于 2016-08-26 23:32:29
正如已经提到的,这在SunMSCAPI中是不可能的。实际上,有一个开放的增强请求,其中一个人可以投票支持修复该问题。
发布于 2018-05-05 14:52:22
下一代api不是在与windows crypto api交互的sunmscapi c++代码文件security.cpp -中实现的。在sunmscapi的java代码中也没有实现EC。
您可以在此处查看来自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函数。
让它工作意味着你自己重写所有的sunmscapi,使用新的下一代加密api。
https://stackoverflow.com/questions/32239859
复制相似问题