如何用C# .NET验证含SignatureConfirmation的SOAP响应签名(已备Key.cert)
C# .NET验证SOAP响应签名的解决方案
核心思路
使用.NET内置的System.Security.Cryptography.Xml和System.Security.Cryptography.X509Certificates类库,加载指定证书后解析SOAP响应的XML签名节点,完成签名验证。
步骤1:加载验证证书
从本地Key.cert文件加载X509证书,提取公钥用于签名验证:
// 加载证书(如果是PFX格式带密码,需添加密码参数) X509Certificate2 validationCert = new X509Certificate2("Key.cert");
步骤2:解析SOAP响应并验证签名
以下是完整的验证代码,需替换soapResponseContent为实际的SOAP响应字符串:
using System.Security.Cryptography.Xml; using System.Security.Cryptography.X509Certificates; using System.Xml; // 1. 加载SOAP响应XML XmlDocument soapXml = new XmlDocument(); soapXml.PreserveWhitespace = true; // 保留XML空白,签名验证对格式敏感 soapXml.LoadXml(soapResponseContent); // 2. 配置命名空间管理器(匹配SOAP响应中的命名空间) XmlNamespaceManager nsManager = new XmlNamespaceManager(soapXml.NameTable); nsManager.AddNamespace("wsse", "http://docs.oasis-open.org/wss/oasis-wss-wssecurity-secext-1.1.xsd"); nsManager.AddNamespace("ds", "http://www.w3.org/2000/09/xmldsig#"); // 3. 定位WS-Security签名节点 XmlElement signatureElement = soapXml.SelectSingleNode("//wsse:Signature", nsManager) as XmlElement; if (signatureElement == null) { throw new InvalidOperationException("SOAP响应中未找到WS-Security签名节点"); } // 4. 初始化签名验证对象 SignedXml signedXml = new SignedXml(soapXml); signedXml.LoadXml(signatureElement); // 5. 执行签名验证 bool isSignatureValid = signedXml.CheckSignature(validationCert, verifySignatureOnly: true); // 输出验证结果 if (isSignatureValid) { Console.WriteLine("SOAP响应签名验证通过"); } else { Console.WriteLine("SOAP响应签名验证失败"); }
关键注意事项
- 命名空间匹配:确保代码中的命名空间URI与SOAP响应中的完全一致,否则无法定位签名节点
- XML格式保留:必须设置
PreserveWhitespace = true,因为XML签名对空白字符、换行等格式细节敏感 - 证书格式:如果
Key.cert是PFX格式(包含私钥),加载时需传入密码:new X509Certificate2("Key.cert", "your-cert-password") - SignatureConfirmation说明:你提供的SOAP响应中仅包含
wsse11:SignatureConfirmation,该元素用于确认客户端请求签名已被服务端接收,并非响应本身的签名,请确认完整的SOAP响应是否包含wsse:Signature节点
内容的提问来源于stack exchange,提问作者ELTeleco
相关产品推荐
相关产品推荐

