Добрый день. Тоже бьемся с подписью XML. Проверка justsign.me говорит что подпись недействительна.
GetHashStream взят из приведенных выше примеров кода, разве что константы алгоритмов заменены на PROV_GOST_2012_256 (80) и ALG_SID_GR3411_2012_256 (33)
Далее куски кода взяты миксом из ранее приведенных в треде, и из предоставленного поставщиком услуги файла примера (который кстати проходит валидацию, разве что ругается что сертификат кривой):
SignedInfo := '<SignedInfo xmlns="http://www.w3.org/2000/09/xmldsig#">' +
'<CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"></CanonicalizationMethod>' +
'<SignatureMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34102012-gostr34112012-256"></SignatureMethod>' +
'<Reference URI="#body">' +
'<Transforms>' +
'<Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"></Transform>' +
'<Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"></Transform>' +
'</Transforms>' +
'<DigestMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34112012-256"></DigestMethod>' +
'<DigestValue>' + TIdEncoderMIME.EncodeStream(Hash) + '</DigestValue>' +
'</Reference>'+
'</SignedInfo>';
CertId := 'SenderCertificate';
Security:= '<wsse:Security soap:actor="http://smev.gosuslugi.ru/actors/smev">' +
'<wsse:BinarySecurityToken EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary" ' +
'ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3" ' +
'wsu:Id="' + CertId + '">' + TIdEncoderMIME.EncodeStream(Cert) +
'</wsse:BinarySecurityToken>' +
'<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">' +
SignedInfo +
'<SignatureValue xmlns="http://www.w3.org/2000/09/xmldsig#">' + TIdEncoderMIME.EncodeStream(Sign) + '</SignatureValue>' +
'<KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">' +
'<wsse:SecurityTokenReference>' +
'<wsse:Reference URI="#' + CertId + '" ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3"/>' +
'</wsse:SecurityTokenReference>' +
'</KeyInfo>'+
'</ds:Signature>'+
'</wsse:Security>';
// Собираем итоговый пакет
Result := '<?xml version="1.0" encoding="utf-8"?>' +
'<soap:Envelope xmlns:rar="http://fns.smev.fsrar.ru/serviceLicSA/rev111111" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" ' +
'xmlns:smev="http://smev.gosuslugi.ru/rev111111" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">' +
'<soap:Header>' + Security + '</soap:Header>' +
BodyContext +
'</soap:Envelope>';
Судя по коду, с каноникализацией там не все гладко, но оригинальный-то файл проверку проходит !
Дайджест проверил, вроде результат как совпадает и с cpverify, и с vipnethashcalc
Есть у кого мысли, в чем дело может быть, где нестыковка ?
Отредактировано пользователем 24 февраля 2020 г. 14:35:12(UTC)
| Причина: Не указана