java - 加载 MSCAPI Java keystore 而不加载私钥(硬 token )

标签 java keystore smartcard

我想在 Java 中加载一个 MSCAPI keystore 并检查 MY 存储中的可用证书。但是,这些证书的一些 key 驻留在硬件 token 上,并且弹出窗口会在加载期间询问 token 。

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

keyStore = KeyStore.getInstance("Windows-MY", "SunMSCAPI");
keystore.load(null,null);

最佳答案

弹出窗口是从 MS-CAPI 加密服务提供程序 (CSP) 激活的 - USB token 制造商提供的 DLL - 最后通过驱动程序(也由 token 制造商提供)与 token 通信。 KeyStore 只是进行调用,中间的层只是传递它; token 上的固件是抛出身份验证弹出窗口并维护 session 状态等的固件。

关键的 Java dll 是 sunmscapi.dll,它具有实现:

// 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 的自定义版本以避免此情况或以其他方式破坏此检查。

关于java - 加载 MSCAPI Java keystore 而不加载私钥(硬 token ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12937604/

相关文章:

smartcard - SIM卡入门

德尔福和智能卡

java - 如何让一个循环再次做同样的事情?

java - 从流中的两个列表创建分离值的映射

java - 提供日志记录(调试)上下文

java - 在 Java 中使用自己的随机数进行 TLS 握手

java - 如何在Maven项目中使用ASM库

ssl - keystore 的目的是什么

ssl - Weblogic 自定义信任存储切换到 Java 标准信任

tomcat - 找不到 spring-boot 可执行 war keystore