
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
должен делать то, что хочешь.