web-dev-qa-db-ja.com

Java経由でWindows証明書ストア証明書にアクセスしますか?

CurrentUser/MyおよびLocalMachine/Myで証明書を列挙して使用(署名)できるものを作成しようとしていますが、Windows証明書ストアには何も見つかりませんでした。Java独自のシークレットストアしか見つかりませんでした。 このリンク 有望に見えますが、Javaに付属しているものしか使用できません。

私が見つけた この質問 以前にSOで尋ねられましたが、それは5年前のもので、コンピューターの年では長い時間です。ありがとう!

11
Benjin

開始Java with -Djavax.net.ssl.trustStoreType=WINDOWS-ROOT

詳細については、 http://www.Oracle.com/technetwork/articles/javase/security-137537.html を参照してください。

12
michael.kebe

私はCrypt32が去った場所から選び、JNAを使用して、Windows固有のプログラムを使用する場合にポップアップするのと同じ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);

これは機能するコードの一部にすぎません。コーディング手法を自由に適用してください。

1
Tech Junkie

Javaのクロスプラットフォームの性質には、独自の欠点があります。外部ライブラリがないと、一部(または多く)のOS固有のものにアクセスできません。Windows証明書ストアには、CryptoAPIネイティブ関数を介してのみアクセスできます。 Javaデフォルトのインストールではサポートされていません。

あなたはこのスレッドを見るかもしれません: JavaからWin32 APIメソッドを呼び出す

JNAを使用できる場合は、crypt32.dllのさまざまな 証明書および証明書ストア関数 を使用して、証明書を列挙し、署名操作を実行できます。

1
Crypt32
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
Krzysiek