2015-12-08 4 views
1

Я ищу, чтобы написать что-то, что может перечислять и использовать (подписывать) сертификаты в CurrentUser/My и LocalMachine/My, но я не смог найти что-либо для хранилища сертификатов Windows, только для собственного секретного хранилища Java. This link выглядит многообещающим, но я могу использовать только то, что поставляется с Java.Доступ к сертификатам хранилища сертификатов Windows через Java?

Я обнаружил, что this question спросил об этом раньше, но это от пяти лет назад, что очень долго в компьютерных годах. Благодаря!

ответ

1

Межплатформенный характер Java имеет свои собственные недостатки - вы не можете получить доступ к некоторым (или многим) объектам, не относящимся к ОС, без внешних библиотек. Хранилище сертификатов Windows доступно только через собственные функции CryptoAPI, которые не поддерживаются установкой по умолчанию Java.

Вы можете посмотреть на эту тему: Calling Win32 API method from Java

Если вы можете использовать ЮНА, то вы можете использовать различные Certificate and Certificate Store Functions в Crypt32.dll для перечисления сертификатов и выполнения операций подписи.

+0

JNA звучит как хороший вариант ... но у меня возникли проблемы с пониманием кода примера. Я не думаю, что вы знаете какие-либо методы C# /. NET для этого? – Benjin

+0

Я желаю, чтобы Microsoft сделала жесты доброй воли, разрешив не-Windows Java читать хранилище доверенных данных, загружаемое сервером Windows с помощью обновлений групповой политики. Например. предложить пакет PEM для загрузки с сервера домена :-) –

0
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

Как это определить, какой путь в хранилище сертификатов Windows он перечисляет? Я ожидал увидеть где-то «LocalMachine» или «CurrentUser». – Benjin

+0

Я полагаю, что вы не можете получить эту информацию. Но, может, я ошибаюсь. Дайте мне знать, когда вы это выясните. – Krzysiek

0

Я выбрал откуда Crypt32 слева, используется ЮНА, чтобы получить доступ к сертификаты с помощью диалога те же окна, которое появляется, если вы должны были использовать любые окна определенной программы:

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); 

Это просто кусок кода, который работает; не стесняйтесь применять свои методы кодирования.

 Смежные вопросы

  • Нет связанных вопросов^_^