Java/Keystore Проверка подписанного сертификатаJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Java/Keystore Проверка подписанного сертификата

Сообщение Anonymous »

Я работаю над аутентификацией с помощью клиентского сертификата между встроенным сервером Jetty и клиентом. Они оба используют хранилище ключей. Сертификат клиента подписывается сертификатом сервера, подписанным центром сертификации. Jetty использует 2 метода для аутентификации сертификата клиента: javax.net.ssl.SSLEngine, который, похоже, работает, и они также используют приведенный выше код.

Код: Выделить всё

List certList = Certificate chain sent by the client
KeyStore truststore = server's truststore

//No use of CRL/OSCP/CRLDP
_crls = null;
_enableOCSP = false;
_enableCRLDP = false;

try{
X509CertSelector certSelect = new X509CertSelector();
certSelect.setCertificate((X509Certificate) certList.get(0));

// Configure certification path builder parameters
PKIXBuilderParameters pbParams = new PKIXBuilderParameters(truststore, certSelect);
pbParams.addCertStore(CertStore.getInstance("Collection", new CollectionCertStoreParameters(certList)));

// Set maximum certification path length
pbParams.setMaxPathLength(-1);

// Enable revocation checking
pbParams.setRevocationEnabled(true);

// Set static Certificate Revocation List
if (_crls != null && !_crls.isEmpty())
pbParams.addCertStore(CertStore.getInstance("Collection", new CollectionCertStoreParameters(_crls)));

// Enable On-Line Certificate Status Protocol (OCSP) support
if (_enableOCSP)
Security.setProperty("ocsp.enable","true");

// Enable Certificate Revocation List Distribution Points (CRLDP) support
if (_enableCRLDP)
System.setProperty("com.sun.security.enableCRLDP","true");

// Build certification path
CertPathBuilderResult buildResult = CertPathBuilder.getInstance("PKIX").build(pbParams);

// Validate certification path
CertPathValidator.getInstance("PKIX").validate(buildResult.getCertPath(),pbParams);
}catch(GeneralSecurityException gse){
...
}
Конечно, я должен использовать второй способ...
Итак, давайте сосредоточимся на этом коде: хороший ли это способ проверки подписанного сертификата?
/>Вот дамп моих хранилищ ключей:

Хранилище ключей клиента:

Код: Выделить всё

Entry type: PrivateKeyEntry
Certificate chain length: 2
Certificate[1]:
Owner: EMAILADDRESS=truc@ok.com, CN=Servlet, OU=dev, O=Imbasoft, ST=Ile-de-France, C=FR
Issuer: EMAILADDRESS=contact@greenpacs.com, CN=Greenpacs, OU=dev, O=Imbasoft, L=Bondy, ST=Ile-de-France, C=FR
...

Certificate[2]:
Owner: EMAILADDRESS=contact@greenpacs.com, CN=Greenpacs, OU=dev, O=Imbasoft, L=Bondy, ST=Ile-de-France, C=FR
Issuer: EMAILADDRESS=ghetolay@imbasoft.com, CN=Greenpacs Certificate Authority, OU=dev, O=Imbasoft, ST=Ile-de-France, C=FR
...
Хранилище доверенных сертификатов сервера:

Код: Выделить всё

Entry type: trustedCertEntry

Owner: EMAILADDRESS=contact@greenpacs.com, CN=Greenpacs, OU=dev, O=Imbasoft, L=Bondy, ST=Ile-de-France, C=FR
Issuer: EMAILADDRESS=ghetolay@imbasoft.com, CN=Greenpacs Certificate Authority, OU=dev, O=Imbasoft, ST=Ile-de-France, C=FR
Я не уверен насчет этих хранилищ ключей, но я пробовал использовать другое (добавление сертификата CA в цепочку сертификатов клиента, добавление сертификата в хранилище доверенных сертификатов), и проверка все равно неудача. И с этими хранилищами ключей, похоже, работает первый способ проверки (SSLEngine).

Вывод отладки слишком велик, чтобы помещать его здесь, но вот трассировка стека:

Код: Выделить всё

java.security.cert.CertPathValidatorException: Could not determine revocation status
at sun.security.provider.certpath.PKIXMasterCertPathValidator.validate(PKIXMasterCertPathValidator.java:153)
at sun.security.provider.certpath.PKIXCertPathValidator.doValidate(PKIXCertPathValidator.java:325)
at sun.security.provider.certpath.PKIXCertPathValidator.engineValidate(PKIXCertPathValidator.java:187)
at java.security.cert.CertPathValidator.validate(CertPathValidator.java:267)
at MainClass.main(MainClass.java:75)
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:197)
at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:255)
at sun.security.provider.certpath.CrlRevocationChecker.buildToNewKey(CrlRevocationChecker.java:583)
at sun.security.provider.certpath.CrlRevocationChecker.verifyWithSeparateSigningKey(CrlRevocationChecker.java:459)
at sun.security.provider.certpath.CrlRevocationChecker.verifyRevocationStatus(CrlRevocationChecker.java:339)
at sun.security.provider.certpath.CrlRevocationChecker.verifyRevocationStatus(CrlRevocationChecker.java:248)
at sun.security.provider.certpath.CrlRevocationChecker.check(CrlRevocationChecker.java:189)
at sun.security.provider.certpath.PKIXMasterCertPathValidator.validate(PKIXMasterCertPathValidator.java:131)
... 4 more
Если я отключу отзыв или установлю последний сертификат (вместо первого) как X509CertSelector, код будет работать, но я не уверен в том, что делаю .

Я начинаю сомневаться в коде причала, но я не эксперт в сертификатах и ​​подтверждении связи SSL, поэтому он также может исходить из плохого хранилища ключей/доверенного хранилища. Вот почему я не стал создавать проблему на доске причала и спросил здесь раньше, чтобы убедиться, что код необходимо изменить.

Также было бы полезно узнать, как это сделать. проверить подписанный сертификат на Java.

Подробнее здесь: https://stackoverflow.com/questions/124 ... ertificate
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»