2014-02-08 3 views
1

для клиента PKI Мне нужно получить как сертификаты отказа от отказа, так и сертификаты цифровой подписи. Я выполнил этот код, чтобы получить эти сертификаты:Как получить сертификаты без разрешения и цифровой подписи

keyStore.load(null, null); 
Enumeration<String> aliases = keyStore.aliases(); 
while (aliases.hasMoreElements()) { 
    String alias = aliases.nextElement(); 
     if (keyStore.isKeyEntry(alias)) { 
      java.security.cert.Certificate certificate = keyStore.getCertificate(alias); 
     } 
} 

проблема заключается в том, что оба цифровых и не сертификаты отрицания имеет один и тот же псевдоним. поэтому, когда я вызываю keystore.getCertificate, система всегда будет возвращать первый результат, хотя в окне certmgr.msc я вижу, что существует 2 сертификата, и блок LOOP выполняется два раза, но система всегда будет возвращать дублирующий результат из первого сертификата , Как я могу решить эту проблему?

ответ

2

У вас не может быть двух разных записей с одним и тем же псевдонимом. Но это, как вы можете получить список всех сертификатов первого уровня из хранилища ключей в виде списка

List<Certificate> certificates = new ArrayList<Certificate>(); 
Enumeration<String> aliases = keyStore.aliases(); 
while (aliases.hasMoreElements()) { 
    String alias = aliases.nextElement(); 
    Certificate certificate = keyStore.getCertificate(alias); 
    if (certificate != null) { 
     certificates.add(certificate); 
    } 
} 
+0

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

+0

I Я обновил свой ответ, поэтому теперь список будет содержать все сертификаты, хранящиеся в хранилище ключей. – divanov

+0

Это правильная идея, но, к сожалению, это не будет перечислять все сертификаты в магазине из-за детали реализации (ошибка?) В хранилище Windows ... – Bruno

1

Так вы говорите о certmgr.msc и используя keyStore.load(null, null), я полагаю, что вы используете WINDOWS-ROOT или WINDOWS-MY хранилище ключей, от SunMSCAPI provider.

К сожалению, существует issue with this provider, так как он может повторно использовать один и тот же псевдоним для нескольких записей, что затрудняет или не может получить доступ к некоторым сертификатам.

Псевдоним, используемый этим хранилищем ключей, на самом деле является «дружественным именем» сертификата (в терминологии MS-CAPI). Хотя дружественное имя не обязательно должно быть уникальным в хранилище сертификатов Windows, должно быть имя псевдонима.

Предположительно, поскольку вы, по-видимому, говорите о двух разных сертификатах для одного и того же объекта, но с разными целями, они, вероятно, будут использовать одно и то же дружественное имя по умолчанию.

Один из способов обойти эту проблему - идентифицировать сертификаты с разными дружественными именами в хранилище Windows: в certmgr.msc, выберите сертификат, щелкните правой кнопкой мыши, выберите «Свойства» и измените его «Дружественное имя».

Если у вас есть два разных сертификата (для разных способов использования ключей или по любой другой причине), которые имеют уникальные дружественные имена, они должны появляться с разными именами псевдонимов в вашем KeyStore.