Статус: Новичок
Группы: Участники
Зарегистрирован: 30.10.2018(UTC) Сообщений: 3  Сказал(а) «Спасибо»: 1 раз
|
Доброго времени суток! У меня есть легаси веб-приложение, которое работает с сертификатами: - на UI подписываются xml документы - на бэкенде происходит валидация подписанного документа Прошлые разработчики реализовали создание подписи с помощью алгоритма ГОСТ Р 34.10-2001, используя пример из документации Создание и проверка подписи документа XML по шаблону. Сейчас заказчик требует добавить поддержку алгоритмов подписи ГОСТ Р 34.10-2012 с ключом 256 бит и ГОСТ Р 34.10-2012 с ключом 512 бит. Я взял ваше тестовое приложение Проверка создания электронной подписи XML и пытаюсь подписать xml из примера алгоритмом ГОСТ Р 34.10-2012 с ключом 512 бит, при этом, в исходном коде примера я указал параметр oSignedXML.SignatureType = cadesplugin.CADESCOM_XML_SIGNATURE_TYPE_TEMPLATE; Полный код метода
Код:function MakeXMLSign_NPAPI(dataToSign, certObject) {
try {
var oSigner = cadesplugin.CreateObject("CAdESCOM.CPSigner");
oSigner.Options = cadesplugin.CAPICOM_CERTIFICATE_INCLUDE_END_ENTITY_ONLY;
} catch (err) {
errormes = "Failed to create CAdESCOM.CPSigner: " + err.number;
alert(errormes);
throw errormes;
}
if (oSigner) {
oSigner.Certificate = certObject;
}
else {
errormes = "Failed to create CAdESCOM.CPSigner";
alert(errormes);
throw errormes;
}
var signMethod = "";
var digestMethod = "";
var pubKey = certObject.PublicKey();
var algo = pubKey.Algorithm;
var algoOid = algo.Value;
if (algoOid == "1.2.643.7.1.1.1.1") { // алгоритм подписи ГОСТ Р 34.10-2012 с ключом 256 бит
signMethod = "urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34102012-gostr34112012-256";
digestMethod = "urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34112012-256";
}
else if (algoOid == "1.2.643.7.1.1.1.2") { // алгоритм подписи ГОСТ Р 34.10-2012 с ключом 512 бит
signMethod = "urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34102012-gostr34112012-512";
digestMethod = "urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34112012-512";
}
else if (algoOid == "1.2.643.2.2.19") { // алгоритм ГОСТ Р 34.10-2001
signMethod = "urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34102001-gostr3411";
digestMethod = "urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr3411";
}
else {
errormes = "Данная демо страница поддерживает XML подпись сертификатами с алгоритмом ГОСТ Р 34.10-2012, ГОСТ Р 34.10-2001";
throw errormes;
}
try {
var oSignedXML = cadesplugin.CreateObject("CAdESCOM.SignedXML");
} catch (err) {
alert('Failed to create CAdESCOM.SignedXML: ' + cadesplugin.getLastError(err));
return;
}
oSignedXML.Content = dataToSign;
oSignedXML.SignatureType = cadesplugin.CADESCOM_XML_SIGNATURE_TYPE_TEMPLATE;
oSignedXML.SignatureMethod = signMethod;
oSignedXML.DigestMethod = digestMethod;
debugger;
var sSignedMessage = "";
try {
sSignedMessage = oSignedXML.Sign(oSigner);
}
catch (err) {
errormes = "Не удалось создать подпись из-за ошибки: " + cadesplugin.getLastError(err);
alert(errormes);
throw errormes;
}
return sSignedMessage;
}
В результате я получаю сообщение об ошибке Не удалось создать подпись из-за ошибки: Cannot find object or property. (0x80092004). В связи с этим вопрос: как мне подписать xml указанными алгоритмами? Требуемый браузер IE 11 v.11.55.17763.0 Отредактировано пользователем 30 октября 2018 г. 11:37:29(UTC)
| Причина: Не указана
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 30.10.2018(UTC) Сообщений: 3  Сказал(а) «Спасибо»: 1 раз
|
Обновил код метода, добавил в него XML-шаблон из унаследованного кода.
Код:
function MakeXMLSign_NPAPI(dataToSign, certObject) {
try {
var oSigner = cadesplugin.CreateObject("CAdESCOM.CPSigner");
oSigner.Options = cadesplugin.CAPICOM_CERTIFICATE_INCLUDE_END_ENTITY_ONLY;
} catch (err) {
errormes = "Failed to create CAdESCOM.CPSigner: " + err.number;
alert(errormes);
throw errormes;
}
if (oSigner) {
oSigner.Certificate = certObject;
}
else {
errormes = "Failed to create CAdESCOM.CPSigner";
alert(errormes);
throw errormes;
}
var signMethod = "";
var digestMethod = "";
var pubKey = certObject.PublicKey();
var algo = pubKey.Algorithm;
var algoOid = algo.Value;
if (algoOid == "1.2.643.7.1.1.1.1") { // алгоритм подписи ГОСТ Р 34.10-2012 с ключом 256 бит
signMethod = "urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34102012-gostr34112012-256";
digestMethod = "urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34112012-256";
}
else if (algoOid == "1.2.643.7.1.1.1.2") { // алгоритм подписи ГОСТ Р 34.10-2012 с ключом 512 бит
signMethod = "urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34102012-gostr34112012-512";
digestMethod = "urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34112012-512";
}
else if (algoOid == "1.2.643.2.2.19") { // алгоритм ГОСТ Р 34.10-2001
signMethod = "urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34102001-gostr3411";
digestMethod = "urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr3411";
}
else {
errormes = "Данная демо страница поддерживает XML подпись сертификатами с алгоритмом ГОСТ Р 34.10-2012, ГОСТ Р 34.10-2001";
throw errormes;
}
try {
var oSignedXML = cadesplugin.CreateObject("CAdESCOM.SignedXML");
} catch (err) {
alert('Failed to create CAdESCOM.SignedXML: ' + cadesplugin.getLastError(err));
return;
}
// В шаблоне документа обязательно должны присутствовать следующие элементы:
// BinarySecurityToken - сертификат ключа подписи в кодировке BASE64
// атрибут Id должен содержать уникальный идентификатор
// сертификата в документе
// Signature - элемент с описанием свойств подписи:
// SignedInfo - информация о подписываемых элементах:
// CanonicalizationMethod - алгоритм приведения к каноническому виду.
// Для СМЭВ "http://www.w3.org/2001/10/xml-exc-c14n#"
// SignatureMethod - идентификатор алгоритма подписи.
// Для СМЭВ "http://www.w3.org/2001/04/xmldsig-more#gostr34102001-gostr3411"
// Reference - атрибут URI должен содержать ссылку на подписываемые элементы в вашем документе:
// Transforms - преобразования, которые следует применить к подписываемым элементам.
// В примере - приведение к каноническому виду.
// DigestMethod - идентификатор алгоритма хэширования.
// Для СМЭВ "http://www.w3.org/2001/04/xmldsig-more#gostr3411"
// DigestValue - Хэш-значение подписываемых элементов. Данный элемент следует оставить пустым.
// Его значение будет заполнено при создании подписи.
// SignatureValue - значение подписи. Данный элемент следует оставить пустым.
// Его значение будет заполнено при создании подписи.
// KeyInfo - информация о сертификате ключа подписи
// SecurityTokenReference - ссылка на сертификат
// Reference - атрибут ValueType должен содержать значение
// "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3"
// Атрибут URI должен содержать ссылку на уникальный идентификатор
// сертификата (такой же, как указан в элементе BinarySecurityToken)
// "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
var sContent =
" <soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:lb=\"http://svc.center-inform.ru/serviceLabel/rev111111\" xmlns:wsse=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd\" xmlns:sudt=\"http://sudt.eek.ru/rev111111\" xmlns:wsu=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd\">" +
" <soap:Header>" +
" <wsse:Security soap:actor=\"http://svc.center-inform.ru/actors/fns\">" +
" <ds:Signature xmlns:ds=\"http://www.w3.org/2000/09/xmldsig#\">" +
" <SignedInfo xmlns=\"http://www.w3.org/2000/09/xmldsig#\">" +
" <CanonicalizationMethod Algorithm=\"http://www.w3.org/2001/10/xml-exc-c14n#\"></CanonicalizationMethod>" +
" <SignatureMethod Algorithm=\"http://www.w3.org/2001/04/xmldsig-more#gostr34102001-gostr3411\"></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=\"http://www.w3.org/2001/04/xmldsig-more#gostr3411\"></DigestMethod>" +
" <DigestValue></DigestValue>" +
" </Reference>" +
" </SignedInfo>" +
" <SignatureValue xmlns=\"http://www.w3.org/2000/09/xmldsig#\">" +
"</SignatureValue>" +
" <ds:KeyInfo>" +
" <wsse:SecurityTokenReference>" +
" <wsse:Reference ValueType=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3\" URI=\"#SenderCertificate\"></wsse:Reference>" +
" </wsse:SecurityTokenReference>" +
" </ds:KeyInfo>" +
" </ds:Signature>" +
" <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=\"SenderCertificate\">" +
certObject.Export(cadesplugin.CADESCOM_ENCODE_BASE64) +
" </wsse:BinarySecurityToken>" +
" </wsse:Security>" +
" <Action soap:mustUnderstand=\"1\" xmlns=\"http://schemas.microsoft.com/ws/2005/05/addressing/none\">http://tempuri.org/IGate/CommunicateMessage</Action>" +
" </soap:Header>" +
" <soap:Body wsu:Id=\"body\">" +
" <lb:ServiceSudt>" +
" <sudt:Message>" +
" <sudt:Sender>" +
" <sudt:Name>ФГУП ЦентрИнформ</sudt:Name>" +
" <sudt:Code />" +
" </sudt:Sender>" +
" <sudt:Recipient>" +
" <sudt:Name>Госорган</sudt:Name>" +
" <sudt:Code>Секретный код госоргана</sudt:Code>" +
" </sudt:Recipient>" +
" </sudt:Message>" +
" <sudt:MessageData>" +
" <sudt:AppData>" +
window.btoa(dataToSign) +
" </sudt:AppData>" +
" </sudt:MessageData>" +
" </lb:ServiceSudt>" +
" </soap:Body>" +
"</soap:Envelope>";
oSignedXML.Content = sContent;
oSignedXML.SignatureType = cadesplugin.CADESCOM_XML_SIGNATURE_TYPE_TEMPLATE;
oSignedXML.SignatureMethod = signMethod;
oSignedXML.DigestMethod = digestMethod;
debugger;
var sSignedMessage = "";
try {
sSignedMessage = oSignedXML.Sign(oSigner);
}
catch (err) {
errormes = "Не удалось создать подпись из-за ошибки: " + cadesplugin.getLastError(err);
alert(errormes);
throw errormes;
}
return sSignedMessage;
}
Сейчас получается подписать документ с помощью алгоритма ГОСТ Р 34.10-2001, но при подписи алгоритмом ГОСТ Р 34.10-2012 с ключом 512 бит появляется уже новое сообщение об ошибке Не удалось создать подпись из-за ошибки: An error was encountered while processing an XML digital signature. (0x800705BA) Я правильно понимаю, что проблемы возникают из-за XML-шаблона? И если да, то что необходимо изменить?
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 13.09.2016(UTC) Сообщений: 126
Сказал(а) «Спасибо»: 8 раз Поблагодарили: 35 раз в 28 постах
|
У вас в шаблоне остались старые ГОСТы. <SignatureMethod Algorithm=\"http://www.w3.org/2001/04/xmldsig-more#gostr34102001-gostr3411\"></SignatureMethod>" <DigestMethod Algorithm=\"http://www.w3.org/2001/04/xmldsig-more#gostr3411\"></DigestMethod>" попробуйте заменить на те, что получаете чуть выше: Код:signMethod = "urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34102012-gostr34112012-256";
digestMethod = "urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34112012-256";
}
else if (algoOid == "1.2.643.7.1.1.1.2") { // алгоритм подписи ГОСТ Р 34.10-2012 с ключом 512 бит
signMethod = "urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34102012-gostr34112012-512";
digestMethod = "urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34112012-512";
|
 1 пользователь поблагодарил Aleksandr G* за этот пост.
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 30.10.2018(UTC) Сообщений: 3  Сказал(а) «Спасибо»: 1 раз
|
Aleksandr G*, спасибо! Заработало! Я подозревал, что дело в этих атрибутах, но я неправильно указывал новые ГОСТы. Спасибо, все заработало. Если кто-то столкнется с аналогичной проблемой, то вот исправленный код метода
Код:
function MakeXMLSign_NPAPI(dataToSign, certObject) {
try {
var oSigner = cadesplugin.CreateObject("CAdESCOM.CPSigner");
oSigner.Options = cadesplugin.CAPICOM_CERTIFICATE_INCLUDE_END_ENTITY_ONLY;
} catch (err) {
errormes = "Failed to create CAdESCOM.CPSigner: " + err.number;
alert(errormes);
throw errormes;
}
if (oSigner) {
oSigner.Certificate = certObject;
}
else {
errormes = "Failed to create CAdESCOM.CPSigner";
alert(errormes);
throw errormes;
}
var signMethod = "";
var digestMethod = "";
var pubKey = certObject.PublicKey();
var algo = pubKey.Algorithm;
var algoOid = algo.Value;
if (algoOid == "1.2.643.7.1.1.1.1") { // алгоритм подписи ГОСТ Р 34.10-2012 с ключом 256 бит
signMethod = "urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34102012-gostr34112012-256";
digestMethod = "urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34112012-256";
}
else if (algoOid == "1.2.643.7.1.1.1.2") { // алгоритм подписи ГОСТ Р 34.10-2012 с ключом 512 бит
signMethod = "urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34102012-gostr34112012-512";
digestMethod = "urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34112012-512";
}
else if (algoOid == "1.2.643.2.2.19") { // алгоритм ГОСТ Р 34.10-2001
signMethod = "urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34102001-gostr3411";
digestMethod = "urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr3411";
}
else {
errormes = "Данная демо страница поддерживает XML подпись сертификатами с алгоритмом ГОСТ Р 34.10-2012, ГОСТ Р 34.10-2001";
throw errormes;
}
try {
var oSignedXML = cadesplugin.CreateObject("CAdESCOM.SignedXML");
} catch (err) {
alert('Failed to create CAdESCOM.SignedXML: ' + cadesplugin.getLastError(err));
return;
}
// В шаблоне документа обязательно должны присутствовать следующие элементы:
// BinarySecurityToken - сертификат ключа подписи в кодировке BASE64
// атрибут Id должен содержать уникальный идентификатор
// сертификата в документе
// Signature - элемент с описанием свойств подписи:
// SignedInfo - информация о подписываемых элементах:
// CanonicalizationMethod - алгоритм приведения к каноническому виду.
// Для СМЭВ "http://www.w3.org/2001/10/xml-exc-c14n#"
// SignatureMethod - идентификатор алгоритма подписи.
// Для СМЭВ "http://www.w3.org/2001/04/xmldsig-more#gostr34102001-gostr3411"
// Reference - атрибут URI должен содержать ссылку на подписываемые элементы в вашем документе:
// Transforms - преобразования, которые следует применить к подписываемым элементам.
// В примере - приведение к каноническому виду.
// DigestMethod - идентификатор алгоритма хэширования.
// Для СМЭВ "http://www.w3.org/2001/04/xmldsig-more#gostr3411"
// DigestValue - Хэш-значение подписываемых элементов. Данный элемент следует оставить пустым.
// Его значение будет заполнено при создании подписи.
// SignatureValue - значение подписи. Данный элемент следует оставить пустым.
// Его значение будет заполнено при создании подписи.
// KeyInfo - информация о сертификате ключа подписи
// SecurityTokenReference - ссылка на сертификат
// Reference - атрибут ValueType должен содержать значение
// "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3"
// Атрибут URI должен содержать ссылку на уникальный идентификатор
// сертификата (такой же, как указан в элементе BinarySecurityToken)
// "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
var sContent =
" <soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:lb=\"http://svc.center-inform.ru/serviceLabel/rev111111\" xmlns:wsse=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd\" xmlns:sudt=\"http://sudt.eek.ru/rev111111\" xmlns:wsu=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd\">" +
" <soap:Header>" +
" <wsse:Security soap:actor=\"http://svc.center-inform.ru/actors/fns\">" +
" <ds:Signature xmlns:ds=\"http://www.w3.org/2000/09/xmldsig#\">" +
" <SignedInfo xmlns=\"http://www.w3.org/2000/09/xmldsig#\">" +
" <CanonicalizationMethod Algorithm=\"http://www.w3.org/2001/10/xml-exc-c14n#\"></CanonicalizationMethod>" +
" <SignatureMethod Algorithm=\"" + signMethod + "\"></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=\"" + digestMethod + "\"></DigestMethod>" +
" <DigestValue></DigestValue>" +
" </Reference>" +
" </SignedInfo>" +
" <SignatureValue xmlns=\"http://www.w3.org/2000/09/xmldsig#\">" +
"</SignatureValue>" +
" <ds:KeyInfo>" +
" <wsse:SecurityTokenReference>" +
" <wsse:Reference ValueType=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3\" URI=\"#SenderCertificate\"></wsse:Reference>" +
" </wsse:SecurityTokenReference>" +
" </ds:KeyInfo>" +
" </ds:Signature>" +
" <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=\"SenderCertificate\">" +
certObject.Export(cadesplugin.CADESCOM_ENCODE_BASE64) +
" </wsse:BinarySecurityToken>" +
" </wsse:Security>" +
" <Action soap:mustUnderstand=\"1\" xmlns=\"http://schemas.microsoft.com/ws/2005/05/addressing/none\">http://tempuri.org/IGate/CommunicateMessage</Action>" +
" </soap:Header>" +
" <soap:Body wsu:Id=\"body\">" +
" <lb:ServiceSudt>" +
" <sudt:Message>" +
" <sudt:Sender>" +
" <sudt:Name>ФГУП ЦентрИнформ</sudt:Name>" +
" <sudt:Code />" +
" </sudt:Sender>" +
" <sudt:Recipient>" +
" <sudt:Name>Госорган</sudt:Name>" +
" <sudt:Code>Секретный код госоргана</sudt:Code>" +
" </sudt:Recipient>" +
" </sudt:Message>" +
" <sudt:MessageData>" +
" <sudt:AppData>" +
window.btoa(dataToSign) +
" </sudt:AppData>" +
" </sudt:MessageData>" +
" </lb:ServiceSudt>" +
" </soap:Body>" +
"</soap:Envelope>";
oSignedXML.SignatureType = cadesplugin.CADESCOM_XML_SIGNATURE_TYPE_TEMPLATE;
oSignedXML.Content = sContent;
oSigner.Options = 2;
oSignedXML.SignatureMethod = signMethod;
oSignedXML.DigestMethod = digestMethod;
debugger;
var sSignedMessage = "";
try {
sSignedMessage = oSignedXML.Sign(oSigner);
}
catch (err) {
errormes = "Не удалось создать подпись из-за ошибки: " + cadesplugin.getLastError(err);
alert(errormes);
throw errormes;
}
try{
var newSignedXML = cadesplugin.CreateObject("CAdESCOM.SignedXML");
newSignedXML.Verify(sSignedMessage);
}catch(err){
errormes = "Не удалось верифицировать подпись из-за ошибки: " + cadesplugin.getLastError(err);
alert(errormes);
throw errormes;
}
return sSignedMessage;
}
Отредактировано пользователем 30 октября 2018 г. 15:51:37(UTC)
| Причина: Добавил исправленный рабочий код
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close