Боюсь, вы не можете достоверно указать источник сертификата, по крайней мере, не на уровне Java для поставщика MS CAPI. Но это часть проекта - MS CAPI более или менее собирается инкапсулировать и скрывать происхождение сертификатов / ключей.
Безопасный способ сообщить, что ваш ключ / сертификат исходит от устройства PKCS # 11, - это использовать поставщика SUN PKCS # 11 . Это, однако, имеет недостаток, заключающийся в том, что вам нужно будет указывать путь к вашей собственной библиотеке PKCS # 11 либо статически (в файле java.security, где вы можете статически конфигурировать провайдеров), либо динамически запрашивать его как ввод данных пользователем.
Если использование провайдера PKCS # 11 является слишком большой проблемой в вашей ситуации, я бы предложил реализовать диалог выбора сертификата, который фильтрует подходящие сертификаты. Нет немедленного усиления безопасности, ограничивая MSCAPI сертификатами, исходящими от PKCS # 11 - возможно, есть веская причина, по которой у вашего пользователя установлены другие сертификаты / ключи (часто в форме файлов PKCS # 12). Вам следует только проверить (и чтобы помочь пользователю уже отфильтровать сертификаты, повторяющие этот критерий), чтобы окончательно выбранный сертификат / ключ соответствовал вашим критериям: правильное использование ключа (например, цифровая подпись), надежное использование расширенного ключа, приемлемые или известные политики, присутствующие в сертификаты и т. д.
В ЕС мы постепенно развиваемся к понятию «Квалифицированные сертификаты на защищенном устройстве для создания подписи». Это подразумевает, что сертификаты, поставляемые на такое устройство (например, смарт-карты), будут содержать специальную политику, и центрам сертификации запрещено использовать эти политики для любых других сертификатов, например сертификатов программного обеспечения. Таким образом, это эффективно позволит вам убедиться, что сертификат исходит от безопасного аппаратного устройства. Вы можете проверить, поддерживают ли соответствующие сертификаты эту функцию. В этом документе ETSI перечислены соответствующие OID, которые вы должны искать.