共同联盟提供 IdP 和 SP 元数据。他们的刷新策略建议经常检查元数据聚合使用最新版本。他们强烈推荐 InCommon SP刷新并验证元数据至少每天一次。
按照提供的说明元数据使用页面上,我下载了一份汇总并获得了元数据签名证书的真实副本。
然后,我要“验证下载的元数据上的 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
有一个解决方案,虽然感觉有点不令人满意:
a) 验证 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
应该做你想做的事。