Отправка полной цепочки с карты общего доступа (CAC)?

Я пытаюсь включить SSL-связь с клиентом веб-службы (Axis2), используя сертификат на пользовательской карте CAC. Работает как шарм .... ДО тех пор, пока веб-сервер не будет включен CAC. В этот момент соединение SSL отклоняется с сообщением об ошибке, что другие сертификаты в цепочке не включены.

Я обеспечил доступность провайдера, либо добавив его в файл security.properties, либо создав его программно.

Мой текущий подход состоит в том, чтобы просто установить системные свойства: System.setProperty("javax.net.ssl.keyStore", "NONE"); System.setProperty("javax.net.ssl.keyStoreType", "PKCS11");

Я понимаю из это вопрос/ответ, что этот подход отправляет только сертификат «конечного объекта». Видимо мне нужно реализовать свой собственный X509KeyManager. Это новая область для меня, может ли кто-нибудь предложить хорошую ссылку или предоставить образцы того, как это сделать?

Цените помощь.


person Community    schedule 07.12.2009    source источник
comment
Вы уверены, что хотите говорить здесь о картах CAC?   -  person bmargulies    schedule 08.12.2009


Ответы (1)


Наилучшая реализация диспетчера ключей зависит от издателя сертификатов, которые вы собираетесь использовать.

Если сертификат в CAC пользователя будет всегда выдаваться определенным ЦС, просто сохраните сертификат этого издателя и любые промежуточные сертификаты, расположенные выше по цепочке, в файле PKCS #7. В getCertificateChain() эта коллекция может быть добавлена ​​вслепую к сертификату пользователя и возвращена.

Если все не так просто, но можно перечислить полный список возможных эмитентов, получить все их сертификаты, сертификаты их эмитента и так далее, вплоть до корневых сертификатов.

Добавьте все корневые сертификаты в хранилище ключей как доверенные записи. Объедините промежуточные сертификаты в файл формата PKCS-#7.

Реализовать X509KeyManager (или расширить < a href="http://java.sun.com/javase/6/docs/api/javax/net/ssl/X509ExtendedKeyManager.html" rel="nofollow noreferrer">X509ExtendedKeyManager, если вы работаете с SSLEngine). В частности, в методе getCertificateChain() вы будете использовать CertPathBuilder для создания допустимой цепочки от сертификата пользователя до доверенного корня. target — это сертификат, который вы загружаете из CAC пользователя с параметром alias. доверенные корни – это созданные вами сертификаты в хранилище доверенных сертификатов; промежуточные сертификаты могут быть загружается из файла PKCS #7 и добавлено в параметры компоновщика. После построения цепочки получить путь к сертификату и преобразовать его в массив. Это результат метода getCertificateChain().

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

person erickson    schedule 07.12.2009
comment
Если вы знаете промежуточные звенья и контролируете сервер, к которому подключаетесь, вы можете добавить необходимые промежуточные звенья в конфигурацию сервера вместо изменения клиента. - person Martin Paljak; 08.12.2009
comment
Возможно. Это зависит от сервера. Когда сервер неправильно сконфигурирован с неполной цепочкой, для клиентов вполне разумно рассматривать это как ошибку. Точно так же разумно иметь те же ожидания для аутентификации клиента. В этом вопросе постер указал, что они контролируют клиента, и попросил помощи в реализации менеджера ключей — подход, который удовлетворяет ожиданиям по обеспечению полной цепочки. - person erickson; 08.12.2009
comment
Спасибо за ответ. Я собираюсь попробовать это с обычным сокетом, а затем выяснить, как вставить такое же изменение в конфигурацию Axis2. - person ; 09.12.2009