InCommon Federation предоставляет метаданные IdP и SP. Их политика обновления рекомендует частую проверку совокупность метаданных использовать самую последнюю версию. Они настоятельно рекомендуют InCommon SP обновить и проверить метаданные хотя бы ежедневно.
Следуя инструкциям на Потребление метаданных страницы, я загружаю агрегат и получаю подлинную копию сертификата подписи метаданных.
Затем я должен «Проверить подпись XML на загруженных метаданных». Вот где у меня проблемы. Я могу проверить загруженные метаданные со встроенным сертификатом x509, но не может проверить с помощью отдельно загруженного сертификата подписи метаданных.
У меня есть два файла, загруженных из InCommon:
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)?
После некоторой борьбы я обнаружил, что вы можете попробовать добавить --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
б) Затем просто сравните встроенный сертификат с отдельно загруженным сертификатом - они должны совпадать по модулю пробела. Обратите внимание, что один или другие сертификаты могут быть связаны цепочкой, что следует игнорировать в целях сравнения.