【问题标题】:Signature xml tags in another position另一个位置的签名 xml 标签
【发布时间】:2015-05-30 23:41:51
【问题描述】:

我正在用 c# 签署一份文件 使用此代码

public class program
    {
        static void Main(String[] arg)
        {
            string xmlString = File.ReadAllText(@"D:\E-Billing\Demo.xml");
            XmlDocument doc = new XmlDocument();
            doc.LoadXml(xmlString);
            //doc.Load(@"D:\E-Billing\Demo.xml");

            string pfxStr = @"D:\E-Billing\jojolete.pfx";
            X509Certificate2 cert = new X509Certificate2(File.ReadAllBytes(pfxStr),"cabanillas");
            SignedXMLWithCertificate(doc, cert);

            Console.WriteLine(doc.OuterXml);
            doc.Save(@"D:\E-Billing\Demo2.xml");

        }

        public static void SignedXMLWithCertificate(XmlDocument doc, X509Certificate2 cert)
        {
            SignedXml signedXML = new SignedXml(doc);
            signedXML.SigningKey = cert.PrivateKey;
            Reference reference = new Reference();
            reference.Uri = "";
            reference.AddTransform(new XmlDsigEnvelopedSignatureTransform());
            signedXML.AddReference(reference);

            KeyInfo keyinfo = new KeyInfo();
            keyinfo.AddClause(new KeyInfoX509Data(cert));
            signedXML.KeyInfo = keyinfo;
            signedXML.ComputeSignature();
            XmlElement xmlsig = signedXML.GetXml();

            //doc.DocumentElement.AppendChild(doc.ImportNode(xmlsig, true));
        XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);
        nsmgr.AddNamespace("ext", "");
        doc.SelectSingleNode("/Invoice/ext:ExtensionContent", nsmgr).AppendChild(doc.ImportNode(xmlsig, true));

        }

我要签名的xml文档有以下标签插入签名的地方

<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
<Invoice>
 <ext:UBLExtensions>
 <ext:UBLExtension>
 <ext:ExtensionContent>
 <sac:AdditionalInformation>
 <sac:AdditionalMonetaryTotal>
 <cbc:ID>1001</cbc:ID>
 <cbc:PayableAmount currencyID="PEN">348199.15</cbc:PayableAmount>
 </sac:AdditionalMonetaryTotal>
 <sac:AdditionalMonetaryTotal>
 <cbc:ID>1003</cbc:ID>
 <cbc:PayableAmount currencyID="PEN">12350.00</cbc:PayableAmount>
 </sac:AdditionalMonetaryTotal>
 <sac:AdditionalMonetaryTotal>
 <cbc:ID>1004</cbc:ID>
 <cbc:PayableAmount currencyID="PEN">30.00</cbc:PayableAmount>
 </sac:AdditionalMonetaryTotal>
 <sac:AdditionalMonetaryTotal>
 <cbc:ID>2005</cbc:ID>
 <cbc:PayableAmount currencyID="PEN">59230.51</cbc:PayableAmount>
 </sac:AdditionalMonetaryTotal>
 <sac:AdditionalProperty>
 <cbc:ID>1000</cbc:ID>
 <cbc:Value>CUATROCIENTOS VEINTITRES MIL DOSCIENTOS VEINTICINCO Y
00/100</cbc:Value>
 </sac:AdditionalProperty>
 </sac:AdditionalInformation>
 </ext:ExtensionContent>
 </ext:UBLExtension>
 <ext:UBLExtension>
    <ext:ExtensionContent>
        <ds:Signature Id="SignatureSP">
            <ds:SignedInfo>
                <ds:CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
                <ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
                <ds:Reference URI="">
                    <ds:Transforms>
                        <ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#envelopedsignature"/>
                    </ds:Transforms>
                    <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
                    <ds:DigestValue>ryg5Vl+...Qjk=</ds:DigestValue>
                </ds:Reference>
            </ds:SignedInfo>
            <ds:SignatureValue>SOiGQp....ffb0=</ds:SignatureValue>
            <ds:KeyInfo>
                <ds:X509Data>
                    <ds:X509SubjectName>1.2IMA,ST=LIMA,C=PE</ds:X509SubjectName>
                    <ds:X509Certificate>MIIESTCCAzGgAwIBAgIKWOC++GxDtaK/5EiVKSqzJ6geIfz</ds:X509Certificate>
                </ds:X509Data>
            </ds:KeyInfo>
        </ds:Signature>
    </ext:ExtensionContent>
 </ext:UBLExtension>
</ext:UBLExtensions>
 more tags
</Invoice>

但标签签名出现在末尾​​p>

<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
    <SignedInfo>
      <CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" />
      <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" />
      <Reference URI="">
        <Transforms>
          <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
        </Transforms>
        <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
        <DigestValue>GF0......OR/nXwTxw=</DigestValue>
      </Reference>
    </SignedInfo>
    <SignatureValue>JQLyp...wEN6Th</SignatureValue>
    <KeyInfo>
      <X509Data>
        <X509Certificate>o6pQR6K.......XJODMUu</X509Certificate>
      </X509Data>
    </KeyInfo>
  </Signature>
</Invoice>

因为我可以移动或指定他们将签署 xml 的位置?

【问题讨论】:

  • 为什么要移动它?最后不是很好吗?我在文件末尾的签名从来没有遇到过问题。
  • 感谢您的回答,根据发送 xml 的文档,我在那个位置问你这个 ext: ExtensionContent 有可能在那里签名吗?
  • 如果“cabanillas”是官方 PFX 代码签名文件的真实密码,您现在应该更改它。它不再安全。
  • 感谢您的回答,主要是在进行的测试中只取有趣的名字来释放压力,这是我的习惯感谢提示
  • 如果答案有帮助,您可以点击向上箭头。如果它解决了您的问题,请单击复选标记。

标签: c# xml x509certificate2 xml-signature xml-dsig


【解决方案1】:

您可以更改代码的最后一行

doc.DocumentElement.AppendChild(doc.ImportNode(xmlsig, true));

doc.SelectSingleNode("/Invoice/ext:ExtensionContent", nsmgr).AppendChild(doc.ImportNode(xmlsig, true));

文档节点是根节点,所以它会追加到那里。 SelectSingleNode() 使用 XPath 选择不同的节点进行导入。请注意,您需要 extprefix 的命名空间管理器。

XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);
nsmgr.AddNamespace("ext","uri-of-ext");

【讨论】:

  • 当出现错误消息时,尝试使用显示给我的代码 System.NullReferenceException “对象引用未设置为对象的实例。”使用代码如下 nsmgr.AddNamespace("ext", ""); // 这里不完全输入代码
  • 此代码将移至 .net dll,然后在 delphi、VCL 桌面应用程序中使用
猜你喜欢
  • 2020-09-11
  • 2013-04-17
  • 1970-01-01
  • 2017-11-07
  • 1970-01-01
  • 1970-01-01
  • 2015-12-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多