Я использую библиотеку xmlsec, чтобы проверить подпись SAML. Мой код почти идентичен примеру verify4.c, представленному на веб-странице xmlsec.xmlsec library - получить предмет подписания ключа
Я связываюсь с библиотекой xmlsec-openssl, поэтому с помощью openssl в качестве криптовального движка.
Я ожидал, что xmlsec рассмотрит подпись действительной только в том случае, если она была подписана с одним из определенных сертификатов, которые я загрузил в диспетчер ключей.
Однако подпись считается действительной, если она подписана с ЛЮБЫМ сертификатом, который может быть проверен с помощью openssl. Это означает, что кто-то может подделать ответ SAML, просто купив сертификат из доверенного корневого ЦС и используя это, чтобы подписать любой ответ, который они хотят.
Не только это, но линия инструмент xmlsec1 команда при условии, с библиотекой, кажется, делает то же самое:
xmlsec1 --verify --dtd-file saml.dtd --pubkey-cert-pem my_cert.cer sample_saml_assertion.xml
...
OK
SignedInfo References (ok/all): 1/1
Manifests References (ok/all): 0/0
На самом деле, в идеальном мире, я был бы рад за любой действительный ключ подписи будет использовалось до тех пор, пока я мог идентифицировать тему ключа и, следовательно, подтвердил, что он был подписан сущностью, которую я ожидал. Это упростило бы вопросы, когда отправитель ответов SAML изменил свой ключ подписи. Но я не смог найти простой способ извлечения сведений о сертификате, который использовался для проверки подписи.
Если это не удается, могу ли я принять только те сертификаты, которые я указал при проверке подписи?