我正在从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])根据证书中的私钥验证签名。
一个人如何工作而另一个人不工作?
答案 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 然后验证签名和证书。
要验证证书,此方法可能会构建整个证书链并检查此链中所有证书的吊销信息。