Accès aux certificats Windows Certificate Store via Java?


Je cherche à écrire quelque chose qui peut énumérer et utiliser (pour signer) des certificats dans CurrentUser/My et LocalMachine/My, mais je n'ai rien trouvé pour le Windows cert store, seulement le propre magasin secret de Java. Ce lien semble prometteur, mais je ne peux utiliser que ce qui est livré avec Java.

J'ai trouvé cette question posée sur SO auparavant, mais elle date d'il y a cinq ans, ce qui est long dans les années informatiques. Merci!

Author: Community, 2015-12-09

4 answers

La nature multiplateforme de Java a ses propres inconvénients-vous ne pouvez pas accéder à certaines (ou à plusieurs) choses spécifiques au système d'exploitation sans bibliothèques externes. Le magasin de certificats Windows est accessible uniquement via les fonctions natives CryptoAPI qui ne sont pas prises en charge par l'installation par défaut de Java.

Vous pouvez jeter un oeil à ce fil: Appelant la méthode API Win32 à partir de Java

Si vous pouvez utiliser JNA, vous pouvez utiliser diverses fonctions Certificate et Certificate Store dans crypt32.dll énumérer les certificats et effectuer des opérations de signature.

 1
Author: Crypt32, 2017-05-23 12:34:54
KeyStore keyStore = KeyStore.getInstance(getKeyStoreType(), "SunMSCAPI");
keyStore.load(null, null);

try {
    Field field = keyStore.getClass().getDeclaredField("keyStoreSpi");
    field.setAccessible(true);

    KeyStoreSpi keyStoreVeritable = (KeyStoreSpi)field.get(keyStore);
    field = keyStoreVeritable.getClass().getEnclosingClass().getDeclaredField("entries");
    field.setAccessible(true);
} catch (Exception e) {
    LOGGER.log(Level.SEVERE, "Set accessible keyStoreSpi problem", e);
}

Enumeration enumeration = keyStore.aliases();
 0
Author: Krzysiek, 2015-12-09 09:24:02

J'ai choisi d'où Crypt32 est parti, utilisé JNA pour accéder aux certificats en utilisant la même boîte de dialogue Windows qui apparaît si vous deviez utiliser un programme spécifique à Windows:

    NativeLibrary cryptUI = NativeLibrary.getInstance("Cryptui");
    NativeLibrary crypt32 = NativeLibrary.getInstance("Crypt32");

    Function functionCertOpenSystemStore = crypt32.getFunction("CertOpenSystemStoreA");
    Object[] argsCertOpenSystemStore = new Object[] { 0, "CA"};
    HANDLE h = (HANDLE) functionCertOpenSystemStore.invoke(HANDLE.class, argsCertOpenSystemStore);

    Function functionCryptUIDlgSelectCertificateFromStore = cryptUI.getFunction("CryptUIDlgSelectCertificateFromStore");
    System.out.println(functionCryptUIDlgSelectCertificateFromStore.getName());
    Object[] argsCryptUIDlgSelectCertificateFromStore = new Object[] { h, 0, 0, 0, 16, 0, 0};
    Pointer ptrCertContext = (Pointer) functionCryptUIDlgSelectCertificateFromStore.invoke(Pointer.class, argsCryptUIDlgSelectCertificateFromStore);

    Function functionCertGetNameString = crypt32.getFunction("CertGetNameStringW");
    char[] ptrName = new char[128];
    Object[] argsCertGetNameString = new Object[] { ptrCertContext, 5, 0, 0, ptrName, 128};
    functionCertGetNameString.invoke(argsCertGetNameString);
    System.out.println("Selected certificate is " + new String(ptrName));

    Function functionCertFreeCertificateContext = crypt32.getFunction("CertFreeCertificateContext");
    Object[] argsCertFreeCertificateContext = new Object[] { ptrCertContext};
    functionCertFreeCertificateContext.invoke(argsCertFreeCertificateContext);

    Function functionCertCloseStore = crypt32.getFunction("CertCloseStore");
    Object[] argsCertCloseStore = new Object[] { h, 0};
    functionCertCloseStore.invoke(argsCertCloseStore);

C'est juste un morceau de code qui fonctionne; n'hésitez pas à appliquer vos pratiques de codage.

 0
Author: Tech Junkie, 2017-02-07 11:20:46

Démarrer Java avec -Djavax.net.ssl.trustStoreType=WINDOWS-ROOT.

Voir http://www.oracle.com/technetwork/articles/javase/security-137537.html pour plus d'informations.

 0
Author: michael.kebe, 2018-09-14 10:59:50