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 № 1O 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));