【问题标题】:Load MSCAPI Java Keystore without loading private keys (hard token)加载 MSCAPI Java Keystore 而不加载私钥(硬令牌)
【发布时间】:2012-10-17 15:15:10
【问题描述】:

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

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

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

【问题讨论】:

  • 这个问题并没有引起 emsworth 的广泛关注,也许也可以在 Oracle 论坛上提问(链接到这个问题)。

标签: java keystore smartcard


【解决方案1】:

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

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

【讨论】:

  • 我担心是这样的。我最终需要与硬件令牌进行交互,因此我最终使用 smartcardio 直接与当前插入终端的令牌进行通信。 Java windows 信任库试图为之前插入计算机的令牌加载私钥,这对我来说是不可接受的。
  • Curious... 使用 SmartCard 我可以在不提示输入令牌的情况下加载密钥库:keyStore = KeyStore.getInstance("Windows-MY");密钥库.load(null,null);我想这取决于软件供应商。
【解决方案2】:
猜你喜欢
  • 2020-10-23
  • 2021-09-22
  • 2018-04-16
  • 1970-01-01
  • 2018-01-13
  • 1970-01-01
  • 2021-05-22
  • 2015-02-19
  • 2016-05-03
相关资源
最近更新 更多