Проверить не-SSL сертификат на системное хранилище ключей по умолчанию в Java

У меня есть сертификат X509 (java.security.cert.X509Certificate), и мне нужно его проверить. Доверенный якорь уже находится в системном хранилище сертификатов по умолчанию (jre \ lib \ security \ cacerts), но при необходимости я мог бы добавить его во что-нибудь еще. Сертификат не является сертификатом SSL.

Моя первая идея заключалась в использовании диспетчера доверия Java, поскольку я уже использую HTTP с сертификатами сервера, выпущенными тем же центром сертификации. Но похоже, что это можно использовать только для сертификатов SSL, поскольку он предоставляет только checkServerTrusted и checkClientTrusted. Для полноты картины это моя попытка:

X509TrustManager x509TrustManager=null;
trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
trustManagerFactory.init((KeyStore)null);
for (TrustManager trustManager : trustManagerFactory.getTrustManagers()) 
{  
    if (trustManager instanceof X509TrustManager) 
     {  
       x509TrustManager = (X509TrustManager)trustManager;
     }  
}
java.security.cert.X509Certificate x509 = .... get certificate ...
x509TrustManager.checkServerTrusted(new java.security.cert.X509Certificate[]{x509}, "RSA");

Это делает все, что мне нужно, но, кроме того, он проверяет, действителен ли сертификат для SSL-сервера (или клиента, если я использую checkClientTrusted), и это, очевидно, не работает.

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

В будущем я хотел бы использовать список OCSP или CRL для проверки фактического состояния сертификата.


person Radek Hladík    schedule 04.05.2014    source источник
comment
stackoverflow.com/questions/2457795/   -  person salyh    schedule 05.05.2014
comment
Решение от stackoverflow.com/questions/2457795/ работал.   -  person Radek Hladík    schedule 05.05.2014
comment
У меня есть сертификат X509 ... сертификат не является сертификатом SSL - это несколько сбивает с толку. И X.509, и PKIX имеют почти идентичные стандарты - использование ключа, расширенное использование ключа, политики, альтернативное имя субъекта, альтернативное имя эмитента, ограничения, и т.д. Какие ключевые способы использования и политики различаются?   -  person jww    schedule 13.05.2014
comment
Это означает, что сертификат не использует SSLServer или SSLClient. И у trustManager есть методы для проверки только этих двух случаев использования. Таким образом, trustManager проверяет сертификат правильно, но не работает из-за несоответствия keyUsage. Использование (временная метка) указано в сертификате правильно (как и policyID), и я могу это проверить.   -  person Radek Hladík    schedule 14.05.2014