【问题标题】:Sign xml with XDAES-EPES using PHP使用 PHP 使用 XDAES-EPES 对 xml 进行签名
【发布时间】:2017-11-21 19:44:30
【问题描述】:

我需要使用 XDAES-EPES 签署一份文档,并且我为此使用 PHP。

使用下面的xml,我已经能够计算出下面给出的示例中的摘要值<ds:DigestValue>ql0urtXTsc9W0GMIhTdzYHXnQYfnieoIttOBn9fGw7A=</ds:DigestValue>,但我想知道另一个<ds:DigestValue>5JVZPTwN5Lj0sGTfFzaUeMKCo/xbCAj7fw6TLUFtZIk=</ds:DigestValue>是如何计算的。

我正在使用这个 XML 作为测试用例:

<?xml version="1.0" encoding="UTF-8" xs:xmlns="https://tribunet.hacienda.go.cr/docs/esquemas/2016/v4.2/FacturaElectronica_V.4.2.xsd"?>
<FacturaElectronica>
    <Clave>1</Clave>
    <NumeroConsecutivo>1</NumeroConsecutivo>
    <FechaEmision>1</FechaEmision>
    <Emisor>1</Emisor>
    <Receptor>1</Receptor>
    <CondicionVenta>1</CondicionVenta>
    <CondicionVenta>1</CondicionVenta>
    <MedioPago>1</MedioPago>
    <DetalleServicio>1</DetalleServicio>
    <ResumenFactura>1</ResumenFactura>
    <Normativa>1</Normativa>
</FacturaElectronica>

我应该用与此类似的东西对其进行签名(注意:SignatureValue 和 X509Certificate 已被截断):

<ds:Signature Id="id-e34ffbff277e8d1432e864436aa11882" 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/2001/04/xmldsig-more#rsa-sha256"/>
        <ds:Reference Id="r-id-1" Type="" URI="">
            <ds:Transforms>
                <ds:Transform Algorithm="http://www.w3.org/TR/1999/REC-xpath-19991116">
                    <ds:XPath>not(ancestor-or-self::ds:Signature)</ds:XPath>
                </ds:Transform>
                <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
            </ds:Transforms>
            <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
            <ds:DigestValue>ql0urtXTsc9W0GMIhTdzYHXnQYfnieoIttOBn9fGw7A=</ds:DigestValue>
        </ds:Reference>
        <ds:Reference Type="http://uri.etsi.org/01903#SignedProperties" URI="#xades-ide34ffbff277e8d1432e864436aa11882">
            <ds:Transforms>
                <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
            </ds:Transforms>
            <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
            <ds:DigestValue>5JVZPTwN5Lj0sGTfFzaUeMKCo/xbCAj7fw6TLUFtZIk=</ds:DigestValue>
        </ds:Reference>
    </ds:SignedInfo>
    <ds:SignatureValue Id="value-ide34ffbff277e8d1432e864436aa11882">Mt1TUuPK3W8/0eRtJX5t45GV9bHvMjw....</ds:SignatureValue>
    <ds:KeyInfo>
        <ds:X509Data>
<ds:X509Certificate>MIIFpTCCBI2gAwIBAgIKK+...</ds:X509Certificate>
        </ds:X509Data>
    </ds:KeyInfo>
    <ds:Object>
        <xades:QualifyingProperties xmlns:xades="http://uri.etsi.org/01903/v1.3.2#" Target="#ide34ffbff277e8d1432e864436aa11882">
            <xades:SignedProperties Id="xades-id-e34ffbff277e8d1432e864436aa11882">
                <xades:SignedSignatureProperties>
                    <xades:SigningTime>2016-11-25T16:35:06Z</xades:SigningTime>
                    <xades:SigningCertificate>
                        <xades:Cert>
                            <xades:CertDigest>
                                <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
                                <ds:DigestValue>LoXZC86JwDL7zWC35qj7Q4AzrRQ=</ds:DigestValue>
                            </xades:CertDigest>
                            <xades:IssuerSerial>
                                <ds:X509IssuerName>CN=CA SINPE - PERSONA FISICA,OU=DIVISION DE SERVICIOS FINANCIEROS,O=BANCO CENTRAL DE COSTA RICA,C=CR,2.5.4.5=#130c342d3030302d303034303137</ds:X509IssuerName>
                                <ds:X509SerialNumber>207422209224813750547132</ds:X509SerialNumber>
                            </xades:IssuerSerial>
                        </xades:Cert>
                    </xades:SigningCertificate>
                    <xades:SignaturePolicyIdentifier>
                        <xades:SignaturePolicyId>
                            <xades:SigPolicyId>
                                <xades:Identifier>https://tribunet.hacienda.go.cr/docs/esquemas/2016/v4.1/Resolucion_Comprobantes_Electronicos_DGT-R-48-2016.pdf</xades:Identifier>
                            </xades:SigPolicyId>
                            <xades:SigPolicyHash>
                                <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
                                <ds:DigestValue>NmI5Njk1ZThkNzI0MmIzMGJmZDAyNDc4YjUwNzkzODM2NTBiOWUxNTBkMmI2YjgzYzZjM2I5NTZlNDQ4OWQzMQ==</ds:DigestValue>
                            </xades:SigPolicyHash>
                        </xades:SignaturePolicyId>
                    </xades:SignaturePolicyIdentifier>
                </xades:SignedSignatureProperties>
                <xades:SignedDataObjectProperties>
                    <xades:DataObjectFormat ObjectReference="#r-id-1">
                        <xades:MimeType>application/octet-stream</xades:MimeType>
                    </xades:DataObjectFormat>
                </xades:SignedDataObjectProperties>
            </xades:SignedProperties>
        </xades:QualifyingProperties>
    </ds:Object>
</ds:Signature>

【问题讨论】:

  • 好的。但是我要发送什么文件来签名。在第一个中,我发送了整个 XML。但是第二个哈希呢?

标签: php xml sign xml-signature


【解决方案1】:

根据我读到的herehere,我支持我之前描述的内容:它是节点SignedProperties 的哈希值。这个散列是SignedInfo 节点的一部分,它是之后被签名的那个。第一个链接是波兰语的博客。它并不完美,但谷歌翻译做得相当不错,博客中的信息帮助我更清楚地理解。

确保使节点规范化和base64_encoded

P.S.: Suerte con la implementación que está desarrollando para la factura electronica en Costa Rica ;-D

【讨论】:

    【解决方案2】:

    我刚开始阅读类似的主题,所以这只是一个想法,我没有尝试过,但我相信第二个哈希来自xades:SignedProperties 节点,它是ds:Object 的一部分。

    至少对象和引用中的 id (xades-id-e34ff...) 是相同的。

    希望这能给你(和我:-D)一个提示。

    问候, 塞巴斯蒂安

    【讨论】:

    • 谢谢。一旦我弄清楚,我会发布我的答案。如果你也这样做,请这样做。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-07-16
    • 1970-01-01
    • 1970-01-01
    • 2013-09-01
    • 2015-09-12
    • 1970-01-01
    • 2018-12-07
    相关资源
    最近更新 更多