Проверка подписи для метаданных InCommon SAML с использованием xmlsec1 завершается неудачей

Проверка подписи для метаданных InCommon SAML с использованием xmlsec1 завершается неудачей

InCommon Федерацияпредоставляет метаданные IdP и SP. Их политика обновления рекомендует частую проверкуагрегат метаданныхиспользовать самую последнюю версию. Они настоятельно рекомендуют InCommon SPsобновить и проверить метаданныепо крайней мере ежедневно.

Следуя инструкциям, представленным наПотребление метаданныхстраницу, я загружаю агрегат и получаю подлинную копию сертификата подписи метаданных.

Затем мне нужно "Проверить подпись XML на загруженных метаданных". Вот тут у меня и возникают проблемы. Я могу проверить загруженные метаданныесо встроенным сертификатом x509, но не может выполнить проверку с помощью отдельно загруженного сертификата подписи метаданных.

У меня есть два файла, загруженных с InCommon:

  • xml:InCommon-metadata-idp-only.xml
  • закрытый ключ подписи:inc-md-cert.pem

Я подумал, что смогу выполнить команду:

# xmlsec1 --verify \
     --id-attr:ID urn:oasis:names:tc:SAML:2.0:metadata:EntitiesDescriptor \
     --privkey-pem ./inc-md-cert.pem \
     ./InCommon-metadata-idp-only.xml

Это не срабатывает, сообщая "Не удалось загрузить закрытый ключ из ./inc-md-cert.pem". Я могу проверить, что он содержит действительный ключ, используя openssl x509 -text -in ./inc-md-cert.pem. (и он доступен для чтения, и это правильный путь.) Точно так же не срабатывает, если я ссылаюсь на него с помощью --privkey-pemили --pubkey-pem.

Теперь, если я использую --pubkey-cert-pem ./inc-md-cert.pemвместо этого , он запускается без ошибок, указывая на OK SignedInfo References (ok/all): 1/1.

Но нет, он явно игнорирует мой закрытый ключ подписи и просто выполняет проверку на основе ключа, встроенного в файл metadata.xml. (Я могу --pubkey-cert-pemполностью удалить этот аргумент, и проверка все равно будет работать, используя встроенный сертификат x509.)

Обновлять

Учитывая, что предоставленный файл подписи является самоподписанным (организацией), я попытался добавить себя в качестве доверенного сертификата. Например, если вы попробуете базовую проверку с openssl, сравните:

# openssl verify ./inc-md-cert.pem
error 18 at 9 depth lookup:self signed certificate
# openssl verify -CAfile ./inc-md-cert.pem ./inc-md-cert.pem
./inc-md-cert.pem: OK

Ну и что, если проблема в этом? Поэтому я пробую добавить --trusted-pemопцию

# xmlsec1 --verify \
     --id-attr:ID urn:oasis:names:tc:SAML:2.0:metadata:EntitiesDescriptor \
     --privkey-pem ./inc-md-cert.pem \
     --trusted-pem ./inc-md-cert.pem \
     ./InCommon-metadata-idp-only.xml
func=xmlSecOpenSSLAppKeyLoadBIO:file=app.c:line=263:
   obj=unknown:subj=PEM_read_bio_PrivateKey and PEM_read_bio_PUBKEY:
   error=4:crypto library function failed: 
func=xmlSecOpenSSLAppKeyLoad:file=app.c:line=153:
   obj=unknown:subj=xmlSecOpenSSLAppKeyLoadBIO:
   error=1:xmlsec library function failed:
   filename=/tmp/inc-md-cert.pem;errno=2
func=xmlSecAppCryptoSimpleKeysMngrKeyAndCertsLoad:file=crypto.c:line=118:
   obj=unknown:subj=xmlSecCryptoAppKeyLoad:
   error=1:xmlsec library function failed:uri=./inc-md-cert.pem
Error: failed to load public key from "./inc-md-cert.pem".
Error: keys manager creation failed

Я предполагаю, что это фундаментальная ошибка с моей стороны, поскольку это не может быть так уж сложно: как использовать внешний ключ (предоставленный InCommon) для проверки подписи файла метаданных (предоставленного InCommon)?

решение1

Одно из решений, хотя оно и кажется немного неудовлетворительным:

а) Проверьте файл метаданных InCommonс использованием встроенного сертификата.

# xmlsec1  --verify --id-attr:ID \ 
        urn:oasis:names:tc:SAML:2.0:metadata:EntitiesDescriptor  \
       ./InCommon-metadata-idp-only.xml
OK
SignedInfo References (ok/all): 1/1
Manifests References (ok/all): 0/0

b) Затем просто сравните встроенный сертификат с отдельно загруженным сертификатом — они должны совпадать по модулю пробелов. Обратите внимание, что один или другой сертификат может быть связан цепочкой, что следует игнорировать при сравнении.

решение2

После недолгих мучений я обнаружил, что можно попробовать добавить --enabled-key-dataв командную строку, например:

--enabled-key-data rsa или --enabled-key-data x509

Либо это должно сработать. Вы также можете попробовать

xmlsec1 --list-key-dataчтобы увидеть те, которые вы можете выбрать.

В вашем случае, похоже, что

xmlsec1 --verify \
  --enabled-key-data rsa \
  --id-attr:ID urn:oasis:names:tc:SAML:2.0:metadata:EntitiesDescriptor \
  --pubkey-cert-pem ./inc-md-cert.pem \
  ./InCommon-metadata-idp-only.xml

должен делать то, что хочешь.

Связанный контент