2012-10-17 11 views
12

MSCAPI keystoreをJava内にロードし、MYストアで使用可能な証明書を調べたいとします。ただし、これらの証明書の一部の鍵はハードウェアトークンに存在し、ポップアップは読み込み中にトークンを要求します。秘密キー(ハードトークン)をロードせずにMSCAPI Javaキーストアをロード

Windowsキーストアをロードするときにプライベートキーのロードを遅延する方法はありますか?最後に、また、トークン製造業者によって供給されたドライバ(を通じてトークンと通信 - USBトークン製造業者によって供給されたDLL -

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

この質問には多くの注意が払われていません。オラクルのフォーラムにも質問してください(この質問へのリンク)。 –

答えて

7

ポップアップは、MS-CAPI暗号化サービスプロバイダ(CSP)から起動されています)。 KeyStoreは単に呼び出しを行い、その間のレイヤーはそのまま通過させます。あなたのよう

// 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; 
    } 
    .... 

:トークンのファームウェアには、認証ポップアップをスローし、セッション状態を維持するもの、などの実装を持っているキーのJava DLLがsunmscapi.dllある

です常に秘密鍵をチェックすることができます。これを回避するには、このコードを修正し、sunmscapi.dllのカスタムバージョンを作成する必要があります。

+0

これは私が恐れていたケースです。私は最終的にハードウェアトークンとインターフェイスする必要があったので、スマートカードを使用して、端末に現在挿入されているトークンと直接通信しました。 Javaウィンドウのtruststoreは以前にコンピュータに挿入されていたトークンの秘密鍵を読み込もうとしましたが、それは私には受け入れられませんでした。 – emsworth

+0

好奇心が強い...スマートカードを使用しています。これでトークンの入力を求めずにキーストアをロードすることができます:keyStore = KeyStore.getInstance( "Windows-MY"); keystore.load(null、null);私はそれがソフトウェアベンダーに依存すると思う。 – jBilbo