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