Доступ к сертификатам хранилища сертификатов Windows через Java?

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

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


person Benjin    schedule 08.12.2015    source источник


Ответы (4)


Запустите Java с -Djavax.net.ssl.trustStoreType=WINDOWS-ROOT.

См. https://www.oracle.com/technical-resources/articles/javase/security.html для получения дополнительной информации.

person michael.kebe    schedule 14.09.2018
comment
Страница не существует - person yesIamFaded; 25.08.2020
comment
Мне удалось перейти на страницу сегодня, 14 сентября 2020 года. - person Manabu Tokunaga; 15.09.2020

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

Вы можете взглянуть на эту ветку: Вызов метода API Win32 из Java

Если вы можете использовать JNA, вы можете использовать различные Сертификаты и функции хранилища сертификатов в crypt32.dll для перечисления сертификатов и выполнения операций подписи.

person Crypt32    schedule 09.12.2015
comment
JNA звучит как хороший вариант ... но у меня возникли проблемы с пониманием этого примера кода. Я не думаю, что вы знаете какие-либо методы C # /. NET для этого? - person Benjin; 10.12.2015
comment
Хотелось бы, чтобы Microsoft пошла по пути доброй воли, позволив Java, отличной от Windows, читать доверенное хранилище, выдвинутое сервером Windows через обновления групповой политики. Например. предложить пакет PEM для загрузки с сервера домена :-) - person eel ghEEz; 22.02.2018

Я выбрал то место, где остался Crypt32, использовал JNA для доступа к сертификатам с помощью того же диалогового окна, которое появляется, если вы использовали какую-либо программу, специфичную для 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);

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

person Venkatesh Laguduva    schedule 07.02.2017

person    schedule
comment
Как это определяет, какой путь внутри хранилища сертификатов Windows он перечисляет? Я ожидал увидеть где-нибудь LocalMachine или CurrentUser. - person Benjin; 10.12.2015
comment
Я полагаю, что вы не можете получить эту информацию. Но, может, я ошибаюсь. Дай мне знать, когда поймешь это. - person Krzysiek; 10.12.2015
comment
Если вы посмотрите на документацию поставщика SunMSCAPI он сообщит вам, какой псевдоним хранилища ключей следует использовать для доступа - person sunnychan77; 24.07.2018