2012-10-17 15 views
12

Ich möchte eine MSCAPI keystore innerhalb von Java laden und verfügbare Zertifikate im MY-Store untersuchen. Einige Schlüssel für diese Zertifikate befinden sich jedoch auf Hardwaretokens und ein Popup fragt nach dem Token während des Ladens.Laden MSCAPI Java Keystore ohne Laden von privaten Schlüsseln (Hard-Token)

Gibt es eine Möglichkeit, das Laden der privaten Schlüssel beim Laden des Windows-Keystores zu verzögern? die von den USB-Token Herstellern geliefert DLL - -

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

Diese Frage bekommt nicht viel Aufmerksamkeit, vielleicht fragen Sie auch in den Oracle-Foren (Link zu dieser Frage). –

Antwort

7

Das Popup aus dem MS-CAPI Cryptographic Service Provider (CSP) wird aktiviert, der durch einen Fahrer auf das Token in Verbindung steht schließlich (auch durch die Token-Hersteller geliefert). KeyStore ruft lediglich an und die Layer dazwischen passieren sie einfach; die Firmware auf dem Token ist derjenige, der die Authentifizierung Pop-up und unterhält Session-Zustand etc.

Der Schlüssel Java dll sunmscapi.dll ist, die die Umsetzung hat wirft:

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

Wie Sie kann sehen, dass es immer nach einem privaten Schlüssel sucht. Sie müssten diesen Code ändern und eine benutzerdefinierte Version von sunmscapi.dll erstellen, um dies zu vermeiden oder diese Überprüfung anderweitig zu verhindern.

+0

Ich hatte Angst, das war der Fall. Ich musste schließlich mit einem Hardware-Token interagieren, also benutzte ich Smartcardio, um direkt mit dem Token zu kommunizieren, das aktuell in einem Terminal steckt. Der Java-Windows-Truststore versuchte, die privaten Schlüssel für Token zu laden, die zuvor in den Computer eingefügt worden waren, was für mich inakzeptabel war. – emsworth

+0

Neugierig ... mit einer SmartCard kann ich den Keystore laden, ohne Tokens zu fragen: keyStore = KeyStore.getInstance ("Windows-MY"); keystore.load (null, null); Ich denke, es hängt vom Softwareanbieter ab. – jBilbo