Назад | Перейти на главную страницу

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

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

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

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

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

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

# 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)?

После некоторой борьбы я обнаружил, что вы можете попробовать добавить --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

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

Одно решение, хотя оно немного неудовлетворительное:

а) Проверьте файл метаданных 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

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