0

我正在从 ADFS 生成一个由证书签名的 SAML2 令牌。现在我正在尝试使用相同的证书验证该签名。

X509Certificate2 cert = LoadCert();
XmlDocument token = LoadXmlToken(); //SAML2 token
XmlElement signature = GetSignatureElement(token);

SignedXml signedXml = new SignedXml(token);
signedXml.LoadXml(signature);
bool result1 = signedXml.CheckSignature();            //true
bool result2 = signedXml.CheckSignature(cert, false); //false

CheckSignature() 根据令牌中包含的公钥验证签名。CheckSignature(cert, [true/false]) 根据证书中的私钥验证签名。

怎么可能一个有效而另一个无效?

4

3 回答 3

1

方法 signedXml.CheckSignature() 根据包含在自己签名中的证书评估 xml 签名完整性。

SignedXml.CheckSignature(X509Certificate2, Boolean) 方法根据作为第一个参数传递的证书评估 xml 签名完整性,如果第二个参数为 false,它还可以检查第一个参数中证书的有效性。

可能第二种方法返回 false 因为您指定了错误的证书:不是执行签名的证书或其状态已撤销或过期,或者它是由不受信任的证书颁发机构颁发的。

于 2014-03-14T21:19:31.980 回答
1

使用证书检查时,我们必须在出站防火墙上为检查签名方法启用 IP 地址和/或 URL。在我们的例子中,它试图与根 CA 和子 CA 的网站进行通信。关闭防火墙后,该方法失败了,但是一旦我们确定 URL 正在被访问并打开防火墙,它就开始按预期工作。

于 2015-04-13T10:32:26.180 回答
0

区别在于第二个参数(布尔值)。如果您查看无参数 CheckSignature 方法的文档,您会发现:

此方法还计算引用的摘要和签名的值。

第二种方法有这个文档。如果第二个参数设置为

false然后验证签名和证书。

为了验证证书,此方法可能会构建整个证书链并检查该链中所有证书的吊销信息。

于 2014-03-14T20:25:20.810 回答