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

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

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

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

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

Ценю помощь.

1 ответ

Решение

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

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

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

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

Воплощать в жизнь X509KeyManager (или продлить X509ExtendedKeyManager если вы работаете с SSLEngine). В частности, в getCertificateChain() метод, вы будете использовать CertPathBuilder создать действительную цепочку от сертификата пользователя до доверенного корня. Цель - это сертификат, который вы загружаете из CAC пользователя с alias параметр. Доверенные корни - это сертификаты в доверенном хранилище, которые вы создали; промежуточные сертификаты могут быть загружены из файла PKCS #7 и добавлены в параметры компоновщика. Как только цепочка построена, получите путь к сертификату и преобразуйте его в массив. Это результат getCertificateChain() метод.

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

Другие вопросы по тегам