You need to enable JavaScript to run this app. C# 如何为X509证书XML签名添加符合XADES规范的ds:Object节点
优惠活动
大模型
产品
解决方案
定价
更多

C# 如何为X509证书XML签名添加符合XADES规范的ds:Object节点

C# X509Certificate2 XML签名XAdES结构对接实现

对接需求说明

  • 业务对接方要求在现有XML签名流程中,嵌入指定结构的ds:Object节点,内部承载符合XAdES v1.3.2规范的签名属性
  • 要求嵌入的节点结构如下:
<ds:Object>
    <xades:QualifyingProperties xmlns:xades="http://uri.etsi.org/01903/v1.3.2#">
        <xades:SignedProperties Id="_aba0ee84-5f37-499e-a8e8-caa7f398341c-signedprops">
            <xades:SignedSignatureProperties>
                <xades:SigningTime>2019-02-15T21:09:10+13:00</xades:SigningTime>
            </xades:SignedSignatureProperties>
        </xades:SignedProperties>
    </xades:QualifyingProperties>
</ds:Object>

当前已实现的基础签名结构

现有开发流程生成的签名未包含上述XAdES属性节点,算法、引用规则、节点结构均不符合对接规范,结构示例如下:

<MyElement xmlns="samples">Example text to be signed.
<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/2001/04/xmldsig-more#rsa-sha256"/>
        <Reference URI="">
            <Transforms>
                <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
            </Transforms>
            <DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
            <DigestValue>Kglqb8fjGmMi2n4W8qXldBIY7VBi0xbNn+dZml7H3xw=</DigestValue>
        </Reference>
    </SignedInfo>
    <SignatureValue>Iz5LOjZGefMHvIYs/cr1Vmrg/9gXPDGpJetBEx+k/yzHVAdJf18P2/udFkeOoVMCpVUnNn+H4eVihD2idqg7SMosZeFA4LCQC2/Wn7GCE6k+y0mivCtFZTaXu0yUbwDGWDBvvqMUT87uaRx4o61cm7V3DH8wOUJ05mKtoVFpG20=</SignatureValue>
</Signature>
</MyElement>

对接要求的最终目标结构

调整后需满足以下规范要求,输出的完整签名结构示例如下:

  • 所有XML签名节点统一使用ds前缀,匹配命名空间映射规则
  • 算法组合调整为对接方指定的Exclusive XML C14N规范化、RSA-SHA1签名、SHA1摘要
  • 新增两类Reference引用:一类指向KeyInfo节点,一类指向XAdES SignedProperties节点,所有引用统一配置Exclusive C14N转换规则
  • 补全携带X509IssuerSerial信息的KeyInfo节点
  • 嵌入指定结构的XAdES ds:Object节点
<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
    <ds:SignedInfo>
        <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
        <ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
        <ds:Reference URI="#_33d232d2-4591-4b49-b28d-3cb825fbeaa4">
            <ds:Transforms>
                <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
            </ds:Transforms>
            <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
            <ds:DigestValue>uFw2hAp5tSL4VidzHtTvv3aziis=</ds:DigestValue>
        </ds:Reference>
        <ds:Reference Type="http://uri.etsi.org/01903/v1.3.2#SignedProperties" URI="#_aba0ee84-5f37-499e-a8e8-caa7f398341c-signedprops">
            <ds:Transforms>
                <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
            </ds:Transforms>
            <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
            <ds:DigestValue>X01eQjqcHvYtQbFkpNT7WcvBSxI=</ds:DigestValue>
        </ds:Reference>
        <ds:Reference>
            <ds:Transforms>
                <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
            </ds:Transforms>
            <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
            <ds:DigestValue>OCCzP5CU0TAgyYSLMR+SIMchxrE=</ds:DigestValue>
        </ds:Reference>
    </ds:SignedInfo>
    <ds:SignatureValue>b8AhGMpa+fK6Q5q/HXiPttGIKn2PMXc/GQSrxnI+jnW9Agg6E6R/q+cwMKiYkdlskI/P0UAdwxd+
KQ44k6r2OET4HjMyatG99HFQnS0C0awVO7CPF6cO9069DDmXplWIkHIoBPWSgXh7SQHMpaQihJYo
S9iVr5+qhYQBZYCVwHg=</ds:SignatureValue>
    <ds:KeyInfo Id="_33d232d2-4591-4b49-b28d-3cb825fbeaa4">
        <ds:X509Data>
            <ds:X509IssuerSerial>
                <ds:X509IssuerName>CN=Test CA, O=Test Institution, C=BD</ds:X509IssuerName>
                <ds:X509SerialNumber>12345678</ds:X509SerialNumber>
            </ds:X509IssuerSerial>
        </ds:X509Data>
    </ds:KeyInfo>
    <ds:Object>
        <xades:QualifyingProperties xmlns:xades="http://uri.etsi.org/01903/v1.3.2#">
            <xades:SignedProperties Id="_aba0ee84-5f37-499e-a8e8-caa7f398341c-signedprops">
                <xades:SignedSignatureProperties>
                    <xades:SigningTime>2019-02-15T21:09:10+13:00</xades:SigningTime>
                </xades:SignedSignatureProperties>
            </xades:SignedProperties>
        </xades:QualifyingProperties>
    </ds:Object>
</ds:Signature>

实现注意事项

  • 必须在签名计算前将ds:Object节点添加到XML文档上下文,否则SignedProperties节点的摘要值会计算错误
  • 所有引用节点的摘要计算必须基于Exclusive C14N规则,不能使用默认的Inclusive C14N算法
  • X509IssuerSerial节点的证书名称、序列号必须直接从X509Certificate2对象的IssuerName、SerialNumber属性读取,不能手动拼接字符串,避免出现编码不匹配导致的校验失败
  • 所有节点的命名空间、属性值必须和对接要求完全一致,不能自行修改节点ID、命名空间URI

内容的提问来源于stack exchange,提问作者Mohammad Jalal Ahmadzai

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.31 16:54:03