SignedXml.CheckSignature()为true,但SignedXml.CheckSignature(certificate)为false

时间:2014-03-14 16:50:50

标签: saml-2.0 adfs x509certificate2 signedxml

我正在从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])根据证书中的私钥验证签名。

一个人如何工作而另一个人不工作?

3 个答案:

答案 0 :(得分:1)

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

方法SignedXml.CheckSignature(X509Certificate2,Boolean)针对作为第一个参数传递的证书评估xml签名完整性,并且可选地,如果第二个参数为false,则还检查第一个参数中证书的有效性。

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

区别在于第二个参数(布尔值)。如果您查看parameterless CheckSignature method的文档,可以找到:

  

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

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

  

false 然后验证签名和证书。

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