2015-01-20 7 views
3

Проект, над которым я сейчас работаю, включает управление хранилищами ключей и сертификатами. Поэтому я использую API безопасности Java. Работа с сертификатами работает хорошо, но обработка PKCS12-KeyStores немного запутанна:Java KeyStore-обработка PKCS12

Я экспортировал PKCS12-KeyStore из окон certmgr, в котором участвовали некоторые общедоступные сертификаты (для сертификатов по сертификатам CA). API безопасности открывает соответствующий файл без ошибок и сообщает, что нет записей (чтобы исключить ошибки личного программирования, я покажу ошибку с помощью Java keytool, который использует тот же API безопасности).

#$ keytool -list -keystore keystore.pfx -storetype pkcs12 

Enter Keystore-Password: 

Keystore-Type: PKCS12 
Keystore-Provider: SunJSSE 

Keystore contains 0 Entries 

Проводник KeyStore (другая программа) однако показывает все записи.

Если в KeyStore добавлены частные ключи, они распознаются KeyTool.

Есть ли общее недоразумение с моей стороны или что здесь происходит?

Спасибо заранее, Томас

ответ

4

Это ограничение реализации KeyStore API в стандарте поставщика безопасности Java/Sun.

Имея дело с хранилищем ключей PKCS12, стандартная реализация не может обрабатывать доверенные записи сертификатов. Попытка написать одну такую ​​запись приведет к исключению неподдерживаемой операции, а чтение не приведет к результату.

Он может, однако, иметь дело с записями сертификатов, которые связаны с записью ключа.

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

См обслуживаемого ответ на: Writing a client-server application that uses ssl/tls using java without beeing able to use keytool

Например: это потерпит неудачу, бросая java.security.KeyStoreException: TrustedCertEntry not supported

KeyStore ks = KeyStore.getInstance("PKCS12"); 
ks.load(null, null); 
ks.setCertificateEntry("test", certificate); 

Но это работает:

Security.addProvider(new BouncyCastleProvider()); 
KeyStore ks = KeyStore.getInstance("PKCS12", BouncyCastleProvider.PROVIDER_NAME); 
ks.load(null, null); 
ks.setCertificateEntry("test", ca); 
+0

Это _really_ плохое поведение 'SunJSSE 'поставщик. Предупреждение о том, что общедоступные сертификаты не поддерживаются при чтении из типа магазина PKCS12, не существует. – aliopi