Как правильно рассчитать SignatureValue - PullRequest
0 голосов
/ 17 февраля 2020

У меня есть сертификат с расширением p12. В SoapUI я использую его в сертификате исходящей подписи X509.

Signature algorithm is: rsa-sha256.
Signature canonicalization is: xml-exc-c14n#
Digest algorithm is: sha256

Все отлично работает в SoapUI при отправке запроса.

Проблема в PHP. Я использую DOMDocument («1.0», «UTF-8») для создания элемента SignedInfo. Так что его 1: 1, как в SoapUI (с правильным DigestValue).

Я могу получить правильное DigestValue soap: элемент body. Но не могу получить правильное SignatureValue.

$signedInfoElement = $soapUI->getElementsByTagName('ds:SignedInfo')->item(0);
if(!empty($signedInfoElement)){
   $siC14N = $signedInfoElement->C14N(true, false);
   openssl_sign($siC14N, $signatureValue, $pkeyid, 'sha256WithRSAEncryption');
}

Под созданным SignedInfo (все идет в одну строку):

<ds:SignedInfo><ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"><ec:InclusiveNamespaces xmlns:ec="http://www.w3.org/2001/10/xml-exc-c14n#" PrefixList="soap"/></ds:CanonicalizationMethod><ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/><ds:Reference URI="#id-A72D6FD4C41B1F545F14700558816389"><ds:Transforms><ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"><ec:InclusiveNamespaces xmlns:ec="http://www.w3.org/2001/10/xml-exc-c14n#" PrefixList=""/></ds:Transform></ds:Transforms><ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/><ds:DigestValue>iiyihYsFMjO7QxIVCauydehAhjSm5LZlRGm3lT0VFY0=</ds:DigestValue></ds:Reference></ds:SignedInfo>

Дополнительно я сохраняю целые xml в файл перед отправкой, так что я вижу, что SignedInfo по структуре такой же, как в SoapUI генерируется. Но даже это SignatureValue недопустимо :( Я пробовал все подобные сообщения от stackoverflow, но безуспешно: (

...