首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >加载MSCAPI Java密钥库而不加载私钥(硬令牌)

加载MSCAPI Java密钥库而不加载私钥(硬令牌)
EN

Stack Overflow用户
提问于 2012-10-17 23:15:11
回答 2查看 3.6K关注 0票数 12

我想在Java中加载一个MSCAPI keystore,并检查MY store中的可用证书。但是,这些证书的一些密钥驻留在硬件令牌上,加载期间会弹出一个请求令牌的窗口。

有没有办法在加载Windows密钥库时延迟加载私钥?

代码语言:javascript
复制
keyStore = KeyStore.getInstance("Windows-MY", "SunMSCAPI");
keystore.load(null,null);
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-11-01 03:56:13

弹出窗口是从MS-CAPI Cryptographic Service Provider (CSP)激活的,CSP是由USB令牌制造商提供的DLL,它最终通过驱动程序(也由令牌制造商提供)与令牌通信。KeyStore只是发出一个调用,中间的层只是传递它;令牌上的固件是抛出身份验证弹出窗口并维护会话状态的固件,等等。

关键的Java dll是sunmscapi.dll,它的实现如下:

代码语言:javascript
复制
// Use CertEnumCertificatesInStore to get the certificates
// from the open store. pCertContext must be reset to
// NULL to retrieve the first certificate in the store.
while (pCertContext = ::CertEnumCertificatesInStore(hCertStore, pCertContext))
{
    // Check if private key available - client authentication certificate
    // must have private key available.
    HCRYPTPROV hCryptProv = NULL;
    DWORD dwKeySpec = 0;
    HCRYPTKEY hUserKey = NULL;
    BOOL bCallerFreeProv = FALSE;
    BOOL bHasNoPrivateKey = FALSE;
    DWORD dwPublicKeyLength = 0;

    if (::CryptAcquireCertificatePrivateKey(pCertContext, NULL, NULL,
                                            &hCryptProv, &dwKeySpec, &bCallerFreeProv) == FALSE)
    {
        bHasNoPrivateKey = TRUE;

    } else {
        // Private key is available

    BOOL bGetUserKey = ::CryptGetUserKey(hCryptProv, dwKeySpec, &hUserKey);

    // Skip certificate if cannot find private key
    if (bGetUserKey == FALSE)
    {
        if (bCallerFreeProv)
            ::CryptReleaseContext(hCryptProv, NULL);

        continue;
    }
    ....

正如您所看到的,它总是检查私钥。您必须修改此代码并创建自定义版本的sunmscapi.dll,以避免这种情况,否则会使此检查失败。

票数 7
EN

Stack Overflow用户

发布于 2018-05-30 21:59:44

此问题已在JDK 9中得到解决。

https://bugs.openjdk.java.net/browse/JDK-8153438

http://hg.openjdk.java.net/jdk9/dev/jdk/rev/e7f78523d41d

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12937604

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档