Во-первых, вам нужно установить поддержку PKCS # 11. Это некоторый нативный код, который, вероятно, поставлялся с вашим устройством для чтения карт, предоставляющим .dll (или .so), который обеспечивает интерфейс PKCS # 11. Другое программное обеспечение в системе, такое как продукты Mozilla и поставщик PKCS # 11 от Sun, использует эту библиотеку. (Продукты Microsoft часто используют другой интерфейс, «CAPI».)
Затем, следуя указаниям Справочного руководства PKCS # 11, установите поставщика SunPKCS11
. Единственные свойства, которые я должен был указать в моей настройке, - это расположение собственной «библиотеки», которая была установлена, и суффикс «name» для этого провайдера. Свойство «name» добавляется к «SunPKCS11-», поэтому, если вы укажете «CAC» для имени, вы можете искать Provider
позже с Security.getProvider("SunPKCS11-CAC")
.
Затем вы можете использовать стандартные системные свойства JSSE javax.net.ssl.keyStore
(со значением "NONE"
) и javax.net.ssl.keyStoreType
(со значением "PKCS11"
), чтобы предоставить JSSE доступ к материалу ключа в CAC. , Вам не нужно устанавливать свойство пароля, потому что собственный код должен запрашивать у пользователя его PIN-код при необходимости.
Предостережение заключается в том, что только сертификат конечного объекта пользователя доступен из CAC. Чтобы построить доверенную цепочку, большинство серверов ожидают, что клиент отправит любые промежуточные сертификаты. Обойти это возможно, но сложно, так как это включает в себя реализацию javax.net.ssl.X509KeyManager
. Если сервер, с которым вы работаете, требует полной цепочки, пожалуйста, оставьте следующий вопрос.