MSCAPI keystore
Java 内に をロードし、MY ストアで利用可能な証明書を調べたいと思います。ただし、これらの証明書の一部のキーはハードウェア トークンに存在し、読み込み中にポップアップがトークンを要求します。
Windows キーストアの読み込み時に秘密鍵の読み込みを遅らせる方法はありますか?
keyStore = KeyStore.getInstance("Windows-MY", "SunMSCAPI");
keystore.load(null,null);
ポップアップは、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 のカスタム バージョンを作成する必要があります。