我正在从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); //falseCheckSignature()根据令牌中包含的公钥验证签名。CheckSignature(cert,true/false)根据证书中的私钥验证签名。
怎么会是一个起作用而另一个不起作用?
发布于 2014-03-14 21:19:31
方法signedXml.CheckSignature()根据包含在自己签名中的证书计算xml签名完整性。
方法SignedXml.CheckSignature(X509Certificate2,Boolean)根据作为第一个参数传递的证书计算xml签名完整性,如果第二个参数为false,则还可以在第一个参数中检查证书的有效性。
可能第二个方法返回false,因为您指定了一个错误的证书:不是执行签名的证书,或者它的状态被撤销或过期,或者它是由不可信的证书颁发机构颁发的。
发布于 2015-04-13 10:32:26
在使用证书检查时,我们必须在出站防火墙上为校验签名方法启用IP地址和/或URL。在我们的例子中,它试图与根CA和子CA的网站进行通信。随着防火墙的关闭,方法失败了,但是一旦我们确定了访问的URL并打开了防火墙,它就开始像预期的那样工作了。
发布于 2014-03-14 20:25:20
区别在于第二个参数(布尔值)。如果您查看无参数CheckSignature方法的文档,您可以发现以下内容:
此方法还计算引用摘要和签名的值。
第二种方法有这文档。如果第二个参数设置为
然后,false验证签名和证书。
要验证证书,此方法可能会构建整个证书链并检查该链中所有证书的吊销信息。
https://stackoverflow.com/questions/22411140
复制相似问题