Статус: Новичок
Группы: Участники
Зарегистрирован: 18.09.2017(UTC) Сообщений: 8 Откуда: ЦПС Сказал «Спасибо»: 1 раз
|
Здравствуйте! Я так же пытаюсь выполнить подписывание XML в браузере, но подпись не проходит проверку с сообщением: ЭЦП не подтверждена: Ошибка проверки ЭП: Нарушена целостность ЭПСобственно остался последний шаг - получить валидную подпись блока SignedInfoВот он в исходном виде: Код:
<SignedInfo><CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" /><SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#gostr34102001-gostr3411" /><Reference URI="#SIGNED_BY_CALLER"><Transforms><Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" /><Transform Algorithm="urn://smev-gov-ru/xmldsig/transform" /></Transforms><DigestMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#gostr3411" /><DigestValue></DigestValue></Reference></SignedInfo>
Вот с хэшем от подписываемых данных: Код:
<SignedInfo><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="#SIGNED_BY_CALLER"><Transforms><Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"></Transform><Transform Algorithm="urn://smev-gov-ru/xmldsig/transform"></Transform></Transforms><DigestMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#gostr3411"></DigestMethod><DigestValue>ZE88vJ4ug+xer4OUfd+IjIbDVrO2xbF6eQbwp5Htnm8=</DigestValue></Reference></SignedInfo>
Хэш совпадает с тем что выдает программа на C#. Кстати там подписанная XML проходит проверку. Код:
createObject( 'CAdESCOM.RawSignature', function( err, oRawSignature ) {
if ( err ) {
callback( err );
}
createObject( 'CAdESCOM.HashedData', function( err, hashObject ) {
if ( err ) {
callback( err );
}
hashValue = Base64.decode( hashValue );
hashObject.propset_Algorithm( cadesplugin.CADESCOM_HASH_ALGORITHM_CP_GOST_3411 ).then( function() {
hashObject.propset_DataEncoding( cadesplugin.CADESCOM_BASE64_TO_BINARY ).then( function() {
hashObject.SetHashValue( hashValue ).then( function() {
oRawSignature.SignHash( hashObject, oCert ).then( function( sRawSignature ) {
sRawSignature = Base64.encode( utils.reverse( utils.hexToString( sRawSignature ) ) );
callback( null, sRawSignature );
}, callback);
}, callback);
}, callback);
}, callback);
});
});
Пробовал заменить преобразование подписи: Код:
var ut = {
reverse: function(str) {
var newStr = '', i;
for (i = str.length - 1; i >= 0; i--) {
newStr += str.charAt(i);
}
return newStr;
},
hex : {
d2h : function(d) {
res = d.toString(16).toUpperCase();
if (res.length == 1) {
res = '0' + res;
}
return res;
},
h2d : function (h) {
return parseInt(h, 16);
},
stringToHex : function (string) {
var hex = '';
for (var i = 0; i < string.length; i++) {
hex += this.d2h(string.charCodeAt(i));
}
return hex;
},
hexToString : function (hex) {
var string = '';
for (var b = 0; b < hex.length; b += 2) {
string += String.fromCharCode( parseInt( hex.substr(b, 2), 16 ) );
}
return string;
}
},
base64 : {
_keyStr : 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=',
// public method for encoding
encode : function (input) {
var output = '';
var chr1, chr2, chr3 = "";
var enc1, enc2, enc3, enc4 = "";
var i = 0;
do {
chr1 = input.charCodeAt(i++);
chr2 = input.charCodeAt(i++);
chr3 = input.charCodeAt(i++);
enc1 = chr1 >> 2;
enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
enc4 = chr3 & 63;
if ( isNaN(chr2) ) {
enc3 = enc4 = 64;
} else if (isNaN(chr3)) {
enc4 = 64;
}
output = output +
this._keyStr.charAt(enc1) +
this._keyStr.charAt(enc2) +
this._keyStr.charAt(enc3) +
this._keyStr.charAt(enc4);
chr1 = chr2 = chr3 = '';
enc1 = enc2 = enc3 = enc4 = '';
} while (i < input.length);
return output;
},
// public method for decoding
decode : function (input) {
var output = '';
var chr1, chr2, chr3 = '';
var enc1, enc2, enc3, enc4 = '';
var i = 0;
var base64test = /[^A-Za-z0-9\+\/\=]/g;
if (base64test.exec(input)) {
return null;
}
do {
enc1 = this._keyStr.indexOf(input.charAt(i++));
enc2 = this._keyStr.indexOf(input.charAt(i++));
enc3 = this._keyStr.indexOf(input.charAt(i++));
enc4 = this._keyStr.indexOf(input.charAt(i++));
chr1 = (enc1 << 2) | (enc2 >> 4);
chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
chr3 = ((enc3 & 3) << 6) | enc4;
output = output + String.fromCharCode(chr1);
if (enc3 != 64) {
output = output + String.fromCharCode(chr2);
}
if (enc4 != 64) {
output = output + String.fromCharCode(chr3);
}
chr1 = chr2 = chr3 = '';
enc1 = enc2 = enc3 = enc4 = '';
} while (i < input.length);
return output;
}
}
};
// преобразование подписи перед вставкой в XML так:
sRawSignature = ut.base64.encode( ut.reverse( ut.hex.hexToString( sRawSignature ) ) );
Предыстория в теме "ЭЦП Browser plug-in подпись XML по ГОСТу". В чем может быть проблема? Если требуется, могу привести исходный XML и не удачно подписанный мной.
|