У нас есть служба, получающая множество подписанных XML-документов, некоторые из которых подписаны самоподписанным сертификатом, а некоторые подписаны доверенным центром сертификации.
Как лучше всего убедиться, что сертификат, используемый для подписи XML-документа, находится в списке сертификатов, которым мы доверяем?
Сегодня мы сопоставляем отпечатки сертификатов со списком принятых отпечатков сертификатов.
Можем ли мы доверять уникальности отпечатка большого пальца — или его можно подделать?
Каков наилучший способ решения этой проблемы? (мы не можем заставить всех, кто отправляет подписанные XML-документы, использовать сертификаты от доверенного центра сертификации)
решение1
Если вы используетестандартная XML-подписьсинтаксис, то необязательный KeyInfo может содержать фактический сертификат для использования.
Вам следует использовать отпечаток сертификата из KeyInfo для сопоставления со списком принятых сертификатов, а затем проверить фактическую подпись покопию этого сертификата из вашего хранилища доверенных сертификатовЕсли фактический сертификат, используемый при подписании документа, отличается, этап проверки завершится неудачей, документ следует отклонить, и кто-то, как мы надеемся, должен провести дальнейшее расследование.
Отпечаток сертификата должен быть достаточно сложным, чтобы вероятность случайного наличия двух сертификатов с одинаковым отпечатком была ничтожно мала. Но даже если это произойдет (возможно, по злому умыслу), это должно привести только к выбору неверного сертификата для процесса проверки подписи, что определенно должно привести к сбою проверки.
Но если вы проверяете документс сертификатом, который прилагается к самому документуи затем проверив, что отпечаток сертификата соответствует одному из доверенных сертификатов, выДелать неправильно: по сути, вы используете отпечатки доверенных сертификатов в качестве паролей.