Подпись XML DigestValue недействительна

Я пытаюсь подписать XML-файл с помощью PHP и xmlseclibs. Однако все средства проверки говорят, что моя подпись недействительна. XMLSpy говорит: "Расчетное значение дайджеста не совпадает с дайджестом ссылки"

Это мой XML:

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

Это дайджест, который я получаю:

KaMTM32K5rXl9U6MgG2BXuzNxoQ=

Методы, которые я использовал, чтобы получить это:

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.) Этот веб-сайт: http://hash.online-convert.com/sha1-generator

Это дайджест, который XMLSpy каким-то образом получает, и он работает:

HedaN7TMgHgq2bRypzavMuFLoCg=

Как мне получить этот дайджест?

1 ответ

Решение

XMLSpy форматирует XML, прежде чем подписать его. Он добавляет переводы строки и вкладки, а C14N не удаляет их. Когда вы удаляете <Signature> вы остались с этим XML, который используется для вычисления дайджеста:

<root>
    <value>x</value>

</root>

Другая вещь, которую делает XMLSpy, - это то, что он добавляет атрибут URI="" к <Reference>, Библиотека PHP xmlseclibs не делает этого по умолчанию. Поэтому я изменил свой код на это:

$objDSig->addReference($doc, XMLSecurityDSig::SHA1, array('http://www.w3.org/2000/09/xmldsig#enveloped-signature'), array('force_uri' => TRUE));
Другие вопросы по тегам