Caros colegas, também enfrentei esse problema.
A questão está justamente na forma da assinatura.
1-Na NFe (modelo 55) é necessário montar o template Signature sem adicionar no documento, assinar e só então depois adicionar.
2-No caso da NFSe (serviços) é preciso adicionar o template Signature no documento xml para assinar junto gerando DigestValue, SignatureValue e X509Certificate.
// Meu exemplo funciona para ambos (NFe e NFSe-"Equiplano")
// ANodes vem do documento XML original (é a tag a ser assinada)
// Eu faço uma array com todos os nodes necessarios (FindNode) e depois vou assinado um a um
// Não utilizo SelectNodes pq houveram problemas com isso, até pq a Signature não está no documento ainda.
// Isso somente funcionava bem com nota NFe (modelo 55).
// Informar o Id e a URI a ser assinada e preparar o Signature para receber a assinatura
xmldsig.signature := CreateSignature( ANodes ); // gera a estrutura para assinatura () --> template
if ReferenceById(ANodes) = '' then // Não tem atributo "Id" (é uma NFSe), adicionar no documento antes de assinar.
ANodes.appendChild( xmldsig.signature );
// Informar a URI como referencia antes de assinar(xmldsig.sign). Ex: xmldsig.setReferenceData('#L001', ANodes);
// xmldsig.setReferenceData( "", ANodes ); // Id="NFe...." ou sem Id fica "" como na NFse.
// xmldsig.setReferenceData( "#NFe1232131...", ANodes );
xmldsig.setReferenceData( ReferenceById(ANodes), ANodes );
// Assinar o conteudo xml da tag informada na URI
oSigned := xmldsig.sign(oKey, PURGE or CERTIFICATES) // exporta X509Certificate junto com a assinatura.
if oSigned = nil then // Não gerou assinatura
begin
result := WebResponseNew( EC_XML_NOSIGNER, 'A assinatura do conteúdo não foi realizada.' );
Exit;
end;
if ReferenceById(ANodes) <> '' then // TEM atributo "Id" (é uma NFe), adicionar no documento somente após assinar.
ANodes.parentNode.appendChild( xmldsig.signature );