Подтвердите цифровую подпись с помощью самозаверяющего сертификата

У меня вопрос по проверке цифровой подписи с помощью самоподписанного сертификата:

Мне подходит следующий учебник: http://www.oracle.com/technetwork/articles/javase/dig-signature-api-140772.html.

Однако, если сертификат X.509 является самоподписанным, как получатель может доверять данным сертификата, прикрепленным к сообщению XML? Любой может сгенерировать самоподписанный сертификат и заявить, что он тот же отправитель. Проверка в приведенном выше руководстве всегда возвращает true. Сертификат отправителя должен быть загружен в хранилище доверенных сертификатов получателя, чтобы получатель мог использовать все, что находится в хранилище доверенных сертификатов, для проверки подписанного документа. Я не могу найти никаких ссылок на такой сценарий.


person user815613    schedule 25.06.2011    source источник
comment
Добро пожаловать в SO. Вы можете обновить свой вопрос, отредактировав его. Вы можете голосовать за вопросы (за или против), и если вы получите ответ, который удовлетворяет ваши потребности и отвечает на ваш вопрос, вы можете отметить его как ответ   -  person Eugene Mayevski 'Callback    schedule 01.07.2011


Ответы (2)


Вы правильно поняли - с самозаверяющими сертификатами любой может создать сертификат, и проверка подписи будет в порядке. Причина в том, что проверка подписи выполняет в первую очередь криптографическую операцию, которая завершается успешно. Второй шаг - проверить сам сертификат, а также его происхождение. Когда используется сертификат, подписанный ЦС, сертификат проверяется с использованием сертификата (ов) ЦС до доверенного ЦС (или известного корневого ЦС). С самоподписанным сертификатом проверка невозможна. В приведенном выше руководстве процедура проверки сертификата была пропущена для простоты, поскольку она довольно сложна и выходит за рамки учебника.

person Eugene Mayevski 'Callback    schedule 25.06.2011

Проблема, которую вы описываете, обычно решается с помощью инфраструктуры открытых ключей (PKI).

Это традиционная модель для проверки сертификатов, например, для сайтов HTTPS. Он начинается с набора доверенных центров сертификации (ЦС), из которых вы импортируете сертификаты ЦС как «доверенные». Полученные вами сертификаты объектов затем проверяются на соответствие этому набору доверенных якорей путем создания пути сертификации между сертификатом для проверки и известным вам сертификатом ЦС (привязка сертификата к доверенному издателю, возможно, через промежуточные сертификаты ЦС).

Различные правила для этого описаны в RFC 5280. Система PKI применяется не только к веб-серверам, но и к любому объекту (существуют дополнительные правила для веб-серверов, чтобы убедиться, что вы хотите разговаривать именно с ними, помимо наличия действующего сертификата).

(В частности, поскольку выбор доверенных сертификатов ЦС часто делается от имени пользователя, по крайней мере, по умолчанию, поставщиком ОС или браузера, эта модель не идеальна, но используется чаще всего.)

Кроме того, нет ничего плохого в том, чтобы заранее составить список самозаверяющих сертификатов, которым вы бы доверяли.

В любом случае вам необходимо заранее установить, чему вы доверяете, с помощью дополнительных механизмов (например, встретившись с кем-то, кому вы доверяете, и используя сертификат, который они вам дадут лично).

Эта модель PKI идет рука об руку с форматом X.509 благодаря понятию DN отправителя и Subject DN. У вас могут быть другие модели, например, полагающиеся на сертификаты PGP, в которых вы могли бы построить сеть доверия; вам все равно понадобится начальный набор надежных якорей.

Для XML-DSig в Java вы должны реализовать X509KeySelector, который возвращает только ключ, которому вы доверяете. В простом сценарии, когда у вас есть предопределенный набор самозаверяющих сертификатов, которым вы доверяете, вы можете перебирать хранилище ключей, содержащее эти доверенные сертификаты. В противном случае используйте Руководство программиста Java PKI (как указано в учебнике, который вы использовали).

person Bruno    schedule 25.06.2011