Подпись 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));