У меня есть сертификат с расширением 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, но безуспешно: (