使用 xmlsec1 对 InCommon SAML 元数据进行签名验证失败

使用 xmlsec1 对 InCommon SAML 元数据进行签名验证失败

共同联盟提供 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

应该做你想做的事。

相关内容