/ / DigestValue de assinatura XML é inválido - php, xml, xml-signature, xmlspy, xmlseclibs

DigestValue de assinatura XML é inválido - php, xml, xml-signature, xmlspy, xmlseclibs

Eu estou tentando assinar o arquivo XML com PHP e xmlseclibs. No entanto, todas as ferramentas de validação dizem que minha assinatura é inválida. XMLSpy diz: "O valor de resumo calculado não corresponde ao resumo de referência"

Este é meu XML:

<root><value>x</value></root>

Este é o resumo que recebo:

KaMTM32K5rXl9U6MgG2BXuzNxoQ=

Métodos eu usei para obtê-lo:

1.) PHP:

$doc = new DOMDocument();
$doc->loadXML("<root><value>x</value></root>");
echo base64_encode(sha1($doc->documentElement->C14N(), true));

2.) OpenSSL:

openssl dgst -binary -sha1 test.xml | openssl enc -base64

3.) Este site: http://hash.online-convert.com/sha1-generator

Este é o resumo que o XMLSpy obtém e funciona:

HedaN7TMgHgq2bRypzavMuFLoCg=

Como obtenho este resumo?

Respostas:

0 para resposta № 1

O XMLSpy formata o XML antes de assiná-lo. Adiciona linhas de alimentação e abas e o C14N não as remove. Quando você remove <Signature> você fica com esse XML que é usado para calcular o resumo:

<root>
<value>x</value>

</root>

Outra coisa que o XMLSpy faz é que ele adiciona o atributo URI = "" para <Reference>. A biblioteca PHP xmlseclibs não faz isso por padrão. Então eu mudei meu código para isto:

$objDSig->addReference($doc, XMLSecurityDSig::SHA1, array("http://www.w3.org/2000/09/xmldsig#enveloped-signature"), array("force_uri" => TRUE));