Проблема, которую вы описываете, обычно решается Инфраструктурами открытых ключей (PKI) .
Это традиционная модель для проверки сертификатов для сайтов HTTPS, например.Он начинается с набора доверенных центров сертификации (CA), из которого вы импортируете сертификаты CA как «доверенные».Полученные вами сертификаты объекта затем проверяются по этому набору доверенных якорей путем создания пути сертификации между сертификатом для проверки и известным вам сертификатом CA (связывая сертификат с доверенным издателем, возможно, через промежуточные сертификаты CA).
Различные правила для этого описаны в RFC 5280 .Система PKI применяется не только к веб-серверам, но и к любому объекту (для веб-серверов существуют дополнительные правила, подтверждающие, что они являются теми, с которыми вы хотите общаться, помимо наличия действующего сертификата).
(В частности, из-за того, что выбор сертификатов CA для доверия часто делается от имени пользователя, по крайней мере по умолчанию, поставщиком ОС или браузера, эта модель не идеальна, но она наиболее распространена в использовании.)
Кроме того, нет ничего плохого в том, чтобы составить список самозаверяющих сертификатов, которым вы могли бы доверять заранее.
В любом случае, вам нужно предварительно установить то, чему вы доверяете, с помощью механизмов изгруппы (например, встречаясь с кем-то, кому вы доверяете, и используя сертификат, который они вам дают лично).
Эта модель PKI идет рука об руку с форматом X.509 благодаря понятию Issuer DN и Тема DN .У вас могут быть другие модели, например, основанные на сертификатах PGP, где вы создадите сеть доверия;вам все равно понадобится начальный набор доверенных якорей.
Для XML-DSig в Java вам следует реализовать X509KeySelector
, который возвращает только ключ, которому вы доверяете.В простом сценарии, когда у вас есть предварительно определенный набор самозаверяющих сертификатов, которым вы доверяете, вы можете перебирать хранилище ключей, содержащее эти доверенные сертификаты.В противном случае используйте Java PKI Programmer Guide (как указано в руководстве, которое вы использовали).