Вопрос

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

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

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

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

Ценю вашу помощь.

Это было полезно?

Решение

Наилучшая реализация key manager зависит от поставщика сертификатов, которые вы планируете использовать.

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top