【发布时间】:2012-03-28 20:26:20
【问题描述】:
我正在编写一段代码来验证 X509 证书中 Xml 中的签名,并在主题行中收到异常消息。
我的示例代码
Dim cert As X509Certificate2 = GetCertificate("Certificate Name")
Dim signedXml As SignedXml = New SignedXml(Me.samlResponseXml)
If (signedXml.CheckSignature(cert, True)) Then
' The signature is valid
Else
' The signature is invalid
Throw New ArgumentException("Invalid signature found in Saml Xml.")
End If
我已成功从我的证书存储加载证书(代码的第一行)。 我已经成功填充了signedXml(代码的第二行)。
当我调用signedXml.CheckSignature(cert, True) 函数时抛出异常。消息很不清楚:
值不能为空。
参数名称:名称
有什么线索吗?
调用堆栈:
System.ArgumentNullException 未被用户代码处理
Message=Value 不能为空。参数名称:name ParamName=name
来源=mscorlib 堆栈跟踪: 在 System.Security.Cryptography.CryptoConfig.CreateFromName(字符串名称,对象 [] 参数) 在 System.Security.Cryptography.Xml.SignedXml.CheckSignedInfo(非对称算法密钥) 在 System.Security.Cryptography.Xml.SignedXml.CheckSignature(非对称算法密钥) 在 System.Security.Cryptography.Xml.SignedXml.CheckSignature(X509Certificate2 证书,布尔 verifySignatureOnly) 在 D:\Projects\MyProject\Test.vb:line 117 中的 MyNamespace.MyClass.MyFunction()
更新 1
我打开.Net Framework源码调试,从SignedXml.CheckSignedInfo方法抛出异常,有一行代码
SignatureDescription signatureDescription = CryptoConfig.CreateFromName(SignatureMethod) as SignatureDescription;
很明显 SignatureMethod 是一个 wrap
public string SignatureMethod {
get { return m_signature.SignedInfo.SignatureMethod; }
}
m_signature.SignedInfo.SignatureMethod 是一个空值。我再次从 MSDN 中阅读了 http://msdn.microsoft.com/en-us/library/system.security.cryptography.xml.signedxml.signaturemethod.aspx 处对 SignatureMethod 的解释,并检查了带有签名部分的 Xml 代码粘贴在下面。我有一个 SignatureMethod 标记,其中包含值,但为什么 SignedXml 无法处理它?
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
<SignedInfo>
<CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
<SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" />
<Reference URI="#_ea559faf-417b-407f-bdc2-bccc76dab76c">
<Transforms>
<Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
<Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">
<InclusiveNamespaces PrefixList="#default samlp saml ds xs xsi" xmlns="http://www.w3.org/2001/10/xml-exc-c14n#" />
</Transform>
</Transforms>
<DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
<DigestValue>fvQx+J90ZGKhwj8Mfhg6v/esOtI=</DigestValue>
</Reference>
</SignedInfo>
<SignatureValue>Ft2mQEA3a39uRq5N94pDI8Y6B/UGLXHkZJ+/besOQmEtZoi630vBDzQfIxx5Djgg6YYeF/s67iF+KLgfvBrHxoe3E8xiqTwBigem41+PJdITlwgrOTkLo2sSdj4DaFdxeN+SCy6KfKXpDBvDyN4i/R0hBKodGwytfzK/DMeOhHU=</SignatureValue>
<KeyInfo>
<X509Data>
<X509Certificate>MIICBjCCAXOgAwIBAgIQ3VhOVESMV71O0q5EttLxxDAJBgUrDgMCHQUAMBwxGjAYBgNVBAMTEUlkZW50aXR5UHJvdmlkZXIxMB4XDTExMDkwMTA1MDAwMFoXDTQwMTIzMTA1MDAwMFowHDEaMBgGA1UEAxMRSWRlbnRpdHlQcm92aWRlcjEwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMBVhtKneTweMOgmvwO+i8AvZ5p0/PGatzLKNXVctTROcXb48u3L9JR3sVPasAFNsafq086xqaWyuFM7jAHtYHTQg/oLt+wGCKd7w/n4s0crxM3NVahDmSUPnBW9RZM2XD4pOs9DTu8aEEQGN/p01jrIMgPYhdlVsTJSg43lLyzjAgMBAAGjUTBPME0GA1UdAQRGMESAEHDoTOJwf2lSgqgCU4TXI2ShHjAcMRowGAYDVQQDExFJZGVudGl0eVByb3ZpZGVyMYIQ3VhOVESMV71O0q5EttLxxDAJBgUrDgMCHQUAA4GBAKvsy5KkU9dDNWDRW55/+s7txFfl4ZmWw45AmZYXEA90g+xzALFtWbX/QGqCOx4C0h5fB5Oco084B7gJK/uf2a8oaYvxYGwlxgRxJ9Dq5XBx5ZhOuobT8G2xVy575cbaGnFbObG6/E33Mva1gAYdw7rvGaz/dYuBeChsEIvzROYU</X509Certificate>
</X509Data>
</KeyInfo>
</Signature>
【问题讨论】:
-
您发布的那个 XML 是完整的 Me.samlResponseXml 吗? AFAIK,您必须找到 Signature 元素并将其传递给 LoadXml 元素:signedXml.LoadXml(theSignatureElement)。类似于:msdn.microsoft.com/en-us/library/kd4wwa16.aspx
-
感谢您的评论,这只是 Xml 的签名部分。后来我明白了你的解释。
标签: .net x509certificate xml-signature saml-2.0