Статус: Гость
Группы: Гости
Зарегистрирован: 12.12.2007(UTC) Сообщений: 4
|
Всем доброго дня! Поставили мне задачу подписания xml документов. Подписываю через plugin на клиенте. У меня есть шаблон, делаю подпись по шаблону. Вот код: Код:return new Promise(function (resolve, reject) {
cadesplugin.async_spawn(function* (args) {
// const thumbprint = certSubjectName.split(" ").reverse().join("").replace(/\s/g, "").toUpperCase();
try {
const oStore = yield cadesplugin.CreateObjectAsync("CAdESCOM.Store");
yield oStore.Open(CAPICOM_CURRENT_USER_STORE, CAPICOM_MY_STORE, CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED);
const CertificatesObj = yield oStore.Certificates;
const oCertificates = yield CertificatesObj.Find(cadesplugin.CAPICOM_CERTIFICATE_FIND_SHA1_HASH, certSubjectName);
// const oCertificates = yield CertificatesObj.Find(cadesplugin.CAPICOM_CERTIFICATE_FIND_SUBJECT_NAME, certSubjectName);
const Count = yield oCertificates.Count;
if (Count === 0) {
throw("Certificate not found: " + args[0]);
}
const oCertificate = yield oCertificates.Item(1);
const PublicKey = yield oCertificate.PublicKey();
const Algorithm = yield PublicKey.Algorithm;
const FriendlyName = yield Algorithm.FriendlyName;
const oSigner = yield cadesplugin.CreateObjectAsync("CAdESCOM.CPSigner");
yield oSigner.propset_Certificate(oCertificate);
let alg
if (FriendlyName === 'ГОСТ Р 34.10-2012 256 бит') {
alg = 256;
} else if (FriendlyName === 'ГОСТ Р 34.10-2012 512 бит') {
alg = 512;
}
if (!alg) {
throw("Поддерживаются только сертификаты с алгоритмом 2012г (256 или 512)");
}
const dataToSign = xmlTemplate(xml, certificate.value, alg);
const oSignedXML = yield cadesplugin.CreateObjectAsync("CAdESCOM.SignedXML");
yield oSignedXML.propset_Content(dataToSign);
yield oSignedXML.propset_SignatureMethod(eval('signatureMethod' + alg));
yield oSignedXML.propset_DigestMethod(eval('digestMethod' + alg));
yield oSignedXML.propset_SignatureType(2);
// const sSignedMessage = yield oSignedData.SignCades(oSigner, CADESCOM_CADES_BES, false);
const sSignedMessage = yield oSignedXML.Sign(oSigner);
yield oSignedXML.Verify(sSignedMessage);
yield oStore.Close();
const result = sSignedMessage.replace(/\s+/g, ' ');
const formatted = xmlFormatter(xmlFormatter(result, '<ds:SignatureValue>', '</ds:SignatureValue>'), '<ds:DigestValue>' , '</ds:DigestValue>');
args[1](formatted);
} catch (err) {
console.log(err)
args[2]("Failed to create signature. Error " + err.message);
}
}, certSubjectName, resolve, reject);
});
P.S: смутило что после подписания методом Sign в <ds:SignatureValue> и <ds:DigestValue> в середину хеш значения почему то были вставлены 4 пробела и перенос строки. Чтобы убрать это, я написал функцию для форматирования. Так же я делаю проверку подписи на клиенте методом Verify, эту проверку подписаный документ проходит. Вот мой подписанный документ: Код:<?xml version="1.0" encoding="UTF-8"?> <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:med="http://medicata.ru/schemas/v1/medicata" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><SOAP-ENV:Header><wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" SOAP-ENV:mustUnderstand="1"><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="X509-CB674337BFE1EE4CBB15493659164131">MIID0zCCA4KgAwIBAgITEgAyHq1CUF8kfZbwJQAAADIerTAIBgYqhQMCAgMwfzEjMCEGCSqGSIb3DQEJARYUc3VwcG9ydEBjcnlwdG9wcm8ucnUxCzAJBgNVBAYTAlJVMQ8wDQYDVQQHEwZNb3Njb3cxFzAVBgNVBAoTDkNSWVBUTy1QUk8gTExDMSEwHwYDVQQDExhDUllQVE8tUFJPIFRlc3QgQ2VudGVyIDIwHhcNMTkwMjA1MDczMTExWhcNMTkwNTA1MDc0MTExWjCBmTEhMB8GCSqGSIb3DQEJARYSRGVhZG9rMTVAZ21haWwuY29tMREwDwYDVQQDDAhQYXNzd29yZDERMA8GA1UECwwIZnJvbnRlbmQxEDAOBgNVBAoMB2l0LWFjZXMxGzAZBgNVBAcMElBlcmVzbGF2bC1aYWxlc3NreTESMBAGA1UECAwJWWFyb3NsYXZsMQswCQYDVQQGEwJSVTCBqjAhBggqhQMHAQEBAjAVBgkqhQMHAQIBAgEGCCqFAwcBAQIDA4GEAASBgNMYRpsRit09NOAECQJC0vu3MRk+aI0I17Gh3bflRnHzvq2ohoYeZ5PCz1UW8i0nzeKdsbkm7q5YJNh079XmclyB8HW69YXAKFlo2Q4t/n/GZSv0i2eaKkZJqJWpKz3ljSGoTNmp8Il8gagGYSCrQ3x3yHpnIr/k+F4KZf3yXmrvo4IBcDCCAWwwDgYDVR0PAQH/BAQDAgbAMBMGA1UdJQQMMAoGCCsGAQUFBwMCMB0GA1UdDgQWBBR9Y3je8fmwJNtbOfNKB5OmCaHEVzAfBgNVHSMEGDAWgBQVMXywjRreZtcVnElSlxckuQF6gzBZBgNVHR8EUjBQME6gTKBKhkhodHRwOi8vdGVzdGNhLmNyeXB0b3Byby5ydS9DZXJ0RW5yb2xsL0NSWVBUTy1QUk8lMjBUZXN0JTIwQ2VudGVyJTIwMi5jcmwwgakGCCsGAQUFBwEBBIGcMIGZMGEGCCsGAQUFBzAChlVodHRwOi8vdGVzdGNhLmNyeXB0b3Byby5ydS9DZXJ0RW5yb2xsL3Rlc3QtY2EtMjAxNF9DUllQVE8tUFJPJTIwVGVzdCUyMENlbnRlciUyMDIuY3J0MDQGCCsGAQUFBzABhihodHRwOi8vdGVzdGNhLmNyeXB0b3Byby5ydS9vY3NwL29jc3Auc3JmMAgGBiqFAwICAwNBAEovbj0vAQbYEzg+JRoxP7LF9YngSdro+dOGYhmWt4vczrLL7+UFTrBEcYJ53l74D6yoFbmG0TTH65NsBEsOqI0=</wsse:BinarySecurityToken><ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#" wsu:Id="SIG-1"><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-ENV ds med wsse wsu xsi"/></ds:CanonicalizationMethod><ds:SignatureMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34102012-gostr34112012-512"/><ds:Reference URI="#body"><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 med wsse xsi"/></ds:Transform></ds:Transforms><ds:DigestMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34112012-512"/><ds:DigestValue>0n1Led8Om7nxUzQJxBFYjGN91uAsyKo/oJfoecJvKJK+OglEje0L/2lCi94nd7XbnDWbdswYLm+o923lbgBWMQ==</ds:DigestValue></ds:Reference></ds:SignedInfo><ds:SignatureValue>xf/hvbp/JDPeYrgQGJQTJycMPqYGGzTBd3/9tEHoIiVOTvg6Tu1XKpuTrAgZIpvYbmObSqGUHWk+X7Jv104o+nhRmQE2vqjPQQAlVukNqIl5u1c6pi+ZdZzVnhUixzg147hoZo4aeIpKupxRlnHlO1t8i1jAGU8fRasAJjKwc00=</ds:SignatureValue><ds:KeyInfo wsu:Id="KI-CB674337BFE1EE4CBB15493659164182"><wsse:SecurityTokenReference wsu:Id="STR-CB674337BFE1EE4CBB15493659164213"><wsse:Reference URI="#X509-CB674337BFE1EE4CBB15493659164131" ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3"/></wsse:SecurityTokenReference></ds:KeyInfo></ds:Signature></wsse:Security></SOAP-ENV:Header><SOAP-ENV:Body xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="body"><Pharmacy><Identification><ID>c1740d51-3b5b-4ffc-aa86-b9f416604f3f</ID><Ogrn>1037832003714</Ogrn><LicenceNumber>ЛО-78-03-000477</LicenceNumber><MedicareNumber>12341234</MedicareNumber></Identification><BusinessName>12341234</BusinessName><Address><AddressText>197228, г. Санкт Петербург, Дибуновская ул., д.28, лит.А, пом. №61</AddressText></Address><CommunicationNumbers><PrimaryTelephone>+7 (777) 777-77-77</PrimaryTelephone><ElectronicMail>567567@erwer.rt</ElectronicMail><OtherTelephone>+7 (777) 777-77-77</OtherTelephone></CommunicationNumbers></Pharmacy><Pharmacist><Identification>dd781576-5a5d-4b98-8cf9-14a3ff7142c7</Identification><Name><LastName>Фамилия</LastName><FirstName>Имя</FirstName><MiddleName>Отчество</MiddleName></Name></Pharmacist><med:Pharmacy><med:Identification><med:ID>5</med:ID></med:Identification></med:Pharmacy><med:Patient><med:Identification><med:Snils>123</med:Snils></med:Identification></med:Patient></SOAP-ENV:Body></SOAP-ENV:Envelope>
После этого, подписанный документ отправляю на сервер. Наш бекендщик сказал что КриптоПро выдал ошибку что подпись невалидна. Далее я отдал бекендщику сообщение которое надо подписать и свой сертификат. Он отдал мне следующий уже валидный XML: Код:<?xml version="1.0" encoding="UTF-8"?><SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:med="http://medicata.ru/schemas/v1/medicata" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><SOAP-ENV:Header><wsse:Security SOAP-ENV:mustUnderstand="1" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"><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="X509-CB674337BFE1EE4CBB15493659164131">MIID0zCCA4KgAwIBAgITEgAyHq1CUF8kfZbwJQAAADIerTAIBgYqhQMCAgMwfzEjMCEGCSqGSIb3DQEJARYUc3VwcG9ydEBjcnlwdG9wcm8ucnUxCzAJBgNVBAYTAlJVMQ8wDQYDVQQHEwZNb3Njb3cxFzAVBgNVBAoTDkNSWVBUTy1QUk8gTExDMSEwHwYDVQQDExhDUllQVE8tUFJPIFRlc3QgQ2VudGVyIDIwHhcNMTkwMjA1MDczMTExWhcNMTkwNTA1MDc0MTExWjCBmTEhMB8GCSqGSIb3DQEJARYSRGVhZG9rMTVAZ21haWwuY29tMREwDwYDVQQDDAhQYXNzd29yZDERMA8GA1UECwwIZnJvbnRlbmQxEDAOBgNVBAoMB2l0LWFjZXMxGzAZBgNVBAcMElBlcmVzbGF2bC1aYWxlc3NreTESMBAGA1UECAwJWWFyb3NsYXZsMQswCQYDVQQGEwJSVTCBqjAhBggqhQMHAQEBAjAVBgkqhQMHAQIBAgEGCCqFAwcBAQIDA4GEAASBgNMYRpsRit09NOAECQJC0vu3MRk+aI0I17Gh3bflRnHzvq2ohoYeZ5PCz1UW8i0nzeKdsbkm7q5YJNh079XmclyB8HW69YXAKFlo2Q4t/n/GZSv0i2eaKkZJqJWpKz3ljSGoTNmp8Il8gagGYSCrQ3x3yHpnIr/k+F4KZf3yXmrvo4IBcDCCAWwwDgYDVR0PAQH/BAQDAgbAMBMGA1UdJQQMMAoGCCsGAQUFBwMCMB0GA1UdDgQWBBR9Y3je8fmwJNtbOfNKB5OmCaHEVzAfBgNVHSMEGDAWgBQVMXywjRreZtcVnElSlxckuQF6gzBZBgNVHR8EUjBQME6gTKBKhkhodHRwOi8vdGVzdGNhLmNyeXB0b3Byby5ydS9DZXJ0RW5yb2xsL0NSWVBUTy1QUk8lMjBUZXN0JTIwQ2VudGVyJTIwMi5jcmwwgakGCCsGAQUFBwEBBIGcMIGZMGEGCCsGAQUFBzAChlVodHRwOi8vdGVzdGNhLmNyeXB0b3Byby5ydS9DZXJ0RW5yb2xsL3Rlc3QtY2EtMjAxNF9DUllQVE8tUFJPJTIwVGVzdCUyMENlbnRlciUyMDIuY3J0MDQGCCsGAQUFBzABhihodHRwOi8vdGVzdGNhLmNyeXB0b3Byby5ydS9vY3NwL29jc3Auc3JmMAgGBiqFAwICAwNBAEovbj0vAQbYEzg+JRoxP7LF9YngSdro+dOGYhmWt4vczrLL7+UFTrBEcYJ53l74D6yoFbmG0TTH65NsBEsOqI0=</wsse:BinarySecurityToken><ds:Signature Id="SIG-1" xmlns:ds="http://www.w3.org/2000/09/xmldsig#"><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-ENV ds med wsse wsu xsi"/></ds:CanonicalizationMethod><ds:SignatureMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34102012-gostr34112012-512"/><ds:Reference URI="#body"><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 med wsse xsi"/></ds:Transform></ds:Transforms><ds:DigestMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34112012-512"/><ds:DigestValue>0n1Led8Om7nxUzQJxBFYjGN91uAsyKo/oJfoecJvKJK+OglEje0L/2lCi94nd7XbnDWbdswYLm+o923lbgBWMQ==</ds:DigestValue></ds:Reference></ds:SignedInfo><ds:SignatureValue>qrNnS8F63lGPo29LES1s6f6hOQO3EwiK/JPvdpLmASeIdj9F/VWfbFIDjirz5a0KwwybKwGuP1clQXZ1JjHgcqMA1qAPCXNJde2H78EfmB8WzTf6PocEM031DxqEbUrvrlEsYjLIxIuJUFhDvzfgVvU234JxfhDL06CL9OLZVCk=</ds:SignatureValue><ds:KeyInfo Id="KI-CB674337BFE1EE4CBB15493659164182"><wsse:SecurityTokenReference wsu:Id="STR-CB674337BFE1EE4CBB15493659164213"><wsse:Reference URI="#X509-CB674337BFE1EE4CBB15493659164131" ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3"/></wsse:SecurityTokenReference></ds:KeyInfo></ds:Signature></wsse:Security></SOAP-ENV:Header><SOAP-ENV:Body wsu:Id="body" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"><Pharmacy><Identification><ID>c1740d51-3b5b-4ffc-aa86-b9f416604f3f</ID><Ogrn>1037832003714</Ogrn><LicenceNumber>ЛО-78-03-000477</LicenceNumber><MedicareNumber>12341234</MedicareNumber></Identification><BusinessName>12341234</BusinessName><Address><AddressText>197228, г. Санкт Петербург, Дибуновская ул., д.28, лит.А, пом. №61</AddressText></Address><CommunicationNumbers><PrimaryTelephone>+7 (777) 777-77-77</PrimaryTelephone><ElectronicMail>567567@erwer.rt</ElectronicMail><OtherTelephone>+7 (777) 777-77-77</OtherTelephone></CommunicationNumbers></Pharmacy><Pharmacist><Identification>dd781576-5a5d-4b98-8cf9-14a3ff7142c7</Identification><Name><LastName>Фамилия</LastName><FirstName>Имя</FirstName><MiddleName>Отчество</MiddleName></Name></Pharmacist><med:Pharmacy><med:Identification><med:ID>5</med:ID></med:Identification></med:Pharmacy><med:Patient><med:Identification><med:Snils>123</med:Snils></med:Identification></med:Patient></SOAP-ENV:Body></SOAP-ENV:Envelope>
После сравнение 2 документов я нашел отличия: 1) <ds:SignatureValue> отличаются (но это вроде как ок) 2) вместо Id="SIG-1" я делаю wsu:Id="SIG-1" Голову ломаю, ничего не получается. Подскажите что не так и что нужно поправить? UPD: выяснилось что проблема с SignatureValue, почему то клиентский SignatureValue невалиден. Отредактировано пользователем 6 февраля 2019 г. 13:16:46(UTC)
| Причина: Не указана
|