Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# .Net:SignedXml-使用转换算法exc-c14n对xml进行签名_C#_Signedxml - Fatal编程技术网

C# .Net:SignedXml-使用转换算法exc-c14n对xml进行签名

C# .Net:SignedXml-使用转换算法exc-c14n对xml进行签名,c#,signedxml,C#,Signedxml,我正在尝试使用C#对Xml(实际上是SOAP Xml)进行签名,签名阶段成功通过,但当我尝试验证签名时,它告诉我签名无效。 我对MSDN中的示例所做的唯一更改是使用该示例而不是转换XmlDsigEnvelopedSignatureTransform。 如果我使用XMLDSIGenveledSignatureTransform,我将获得有效的签名 这是我的签名代码: private static XmlDocument SignXml(XmlDocument doc)

我正在尝试使用C#对Xml(实际上是SOAP Xml)进行签名,签名阶段成功通过,但当我尝试验证签名时,它告诉我签名无效。 我对MSDN中的示例所做的唯一更改是使用该示例而不是转换XmlDsigEnvelopedSignatureTransform。 如果我使用XMLDSIGenveledSignatureTransform,我将获得有效的签名

这是我的签名代码:

 private static XmlDocument SignXml(XmlDocument doc)
             {
                 SignedXml signedXml = new SignedXml(doc);
                 signedXml.SigningKey = Certificate.PrivateKey;
    
                 Reference reference = new Reference();
                 reference.Uri = "";
                 
                 XmlDsigEnvelopedSignatureTransform env = new XmlDsigEnvelopedSignatureTransform();
                 //XmlDsigExcC14NTransform env = new XmlDsigExcC14NTransform();

                 reference.AddTransform(env);
    
                 signedXml.AddReference(reference);
                 signedXml.ComputeSignature();
    
                 XmlElement signature = signedXml.GetXml();
                 doc.DocumentElement.AppendChild(signature);
                 doc.Save(SignedXmlPath);
                 return doc;
             }
上面的代码将给我一个有效的签名,但是如果我使用

XmlDsigExcC14NTransform env = new XmlDsigExcC14NTransform();
而不是

XmlDsigEnvelopedSignatureTransform env = new XmlDsigEnvelopedSignatureTransform();
我将得到一个无效的签名

这是我的验证码:

private static bool Verify(XmlDocument doc)
        {
            SignedXml signedDoc = new SignedXml(doc);
            XmlNodeList nodeList = doc.GetElementsByTagName(Constants.SignatureElement);

            signedDoc.LoadXml((XmlElement)nodeList[0]);
            return signedDoc.CheckSignature((RSA)Certificate.PublicKey.Key);
        }
有谁能告诉我如何使用
http://www.w3.org/2001/10/xml-exc-c14n#


提前感谢。

在您的案例中需要
xmldsigenveledsignaturetransform
,因为您正在签名的元素中添加签名

xmldsigenveledsignaturetransform
将告诉
SignedXml
类在测试签名的有效性之前从签名节点本身删除签名。这是必需的,因为您在计算签名后添加了该元素

通过再次调用
AddTransform
,可以添加多个变换,如下所示:

XmlDsigEnvelopedSignatureTransform env = new XmlDsigEnvelopedSignatureTransform();
XmlDsigExcC14NTransform c14n = new XmlDsigExcC14NTransform();

reference.AddTransform(env);
reference.AddTransform(c14n);
但是,我认为您实际上想要做的是将
规范化方法设置为c14n,而不是上面的示例:

signedXml.SignedInfo.CanonicalizationMethod = "http://www.w3.org/2001/10/xml-exc-c14n#";
 - or - 
signedXml.SignedInfo.CanonicalizationMethod = SignedXml.XmlDsigExcC14NTransformUrl;

谢谢你的回答。我现在明白了。实际上,我需要在SOAP消息中对主体进行签名,然后将签名添加到SOAP信封中的安全头中。因此,如果我这样做,我将能够使用XmlDsigExcC14NTransform,因为签名元素将不是签名元素的一部分。正确的?再次感谢…谢谢你。我有一个类似的案例,也需要:c14n.Algorithm=SignedXml.XmlDsigExcC14NTransformUrl;