Статус: Активный участник
Группы: Участники
Зарегистрирован: 20.10.2011(UTC) Сообщений: 45 Откуда: Moscow
Сказал(а) «Спасибо»: 7 раз
|
Стоит следующая задача. В системе документооборота хранятся документы + некоторые мета-данные к ним. Требуется на некоторых этапах подготовки этих документов подписать отделенной УЭЦП текущую версию документа + его мета-данные. Для случая базовой ЭЦП все уже реализовано и работает несколько лет на базе CAPICOM и ActiveX из Javascript. Вот код, который проводит подписание для отделенной подписи и для совмещенной и для обоих случаев выдает сообщение - успешно ли прошла проверка. Код:
var g_sTsaAddress = "http://sp.ekey.ru/tsp/tsp.srf";
var CAPICOM_STORE_OPEN_READ_ONLY = 0;
var CAPICOM_CURRENT_USER_STORE = 2;
var CAPICOM_MY_STORE = "My";
var CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED = 2;
var MICROSOFT_INTERNET_EXPLORER = 'Microsoft Internet Explorer';
var CADESCOM_CADES_X_LONG_TYPE_1 = 0x5d;
var CADESCOM_BASE64_TO_BINARY = 0x01;
var CAPICOM_ENCODE_BASE64 = 0;
var g_bDetached = true;
function isCadESPluginInstalled() {
switch (navigator.appName) {
case MICROSOFT_INTERNET_EXPLORER:
try {
var obj = new ActiveXObject("CAdESCOM.CPSigner");
return true;
}
catch (err) {}
break;
default:
var mimetype = navigator.mimeTypes["application/x-cades"];
if (mimetype) {
var plugin = mimetype.enabledPlugin;
if (plugin) {
return true;
}
}
}
return false;
}
function selectCertificate() {
if (isCadESPluginInstalled() ) {
var MyStore = CreateObject("CAPICOM.Store");
MyStore.Open(CAPICOM_CURRENT_USER_STORE, "My", CAPICOM_STORE_OPEN_READ_ONLY);
var Certificates = MyStore.Certificates;
if (Certificates.Count == 0) {
alert("Нет сертификатов");
return;
} else if (Certificates.Count != 1) {
Certificates = Certificates.Select("Список", "Выберите");
}
return Certificates.Item(1);
}
throw "Nothing selected";
}
function GetErrorMessage(e) {
return e.message + " (" + e.number + ")";
}
// Функция активации объектов КриптоПро ЭЦП Browser plug-in
function CreateObject(name) {
var resultObject;
switch (navigator.appName) {
case MICROSOFT_INTERNET_EXPLORER:
resultObject = new ActiveXObject(name);
break;
default:
var cadesobject = document.getElementById("cadesplugin");
resultObject = cadesobject.CreateObject(name);
}
if (resultObject && resultObject != undefined) {
return resultObject;
} else {
throw "Object '" + name + "' does not created."
}
}
function SignCreate(oCertificate, dataToSign) {
var oSigner = CreateObject("CAdESCOM.CPSigner");
oSigner.Certificate = oCertificate;
oSigner.TSAAddress = "http://sp.ekey.ru/tsp/tsp.srf";
var oSignedData = CreateObject("CAdESCOM.CadesSignedData");
oSignedData.ContentEncoding = CADESCOM_BASE64_TO_BINARY;
oSignedData.Content = dataToSign;
try {
var sSignedMessage =
oSignedData.SignCades(oSigner,
CADESCOM_CADES_X_LONG_TYPE_1, g_bDetached);
document.writeln("<h1>Signature value (detached = " + g_bDetached + "): </h1>");
document.writeln(sSignedMessage);
document.writeln("");
} catch (err) {
alert("Failed to create signature. Error: " + GetErrorMessage(err));
return;
}
return sSignedMessage;
}
function Verify(sSignedMessage, dataToSign) {
var oSignedData = CreateObject("CAdESCOM.CadesSignedData");
if (g_bDetached) {
oSignedData.ContentEncoding = CADESCOM_BASE64_TO_BINARY;
oSignedData.Content = dataToSign;
alert("Signature is detached");
} else {
alert("Signature is not detached");
}
try {
oSignedData.VerifyCades(sSignedMessage,
CADESCOM_CADES_X_LONG_TYPE_1, g_bDetached);
} catch (err) {
alert("Failed to verify signature. Error: " + GetErrorMessage(err));
return false;
}
return true;
}
function run() {
var oCertificate = selectCertificate();
g_bDetached = true;
testCase(oCertificate);
g_bDetached = false;
testCase(oCertificate);
}
function testCase(oCertificate) {
// строка 'CryptoPro' - в Base64
// перекодировал тут: http://www.motobit.com/util/base64-decoder-encoder.asp
var signedMessage = SignCreate(oCertificate, "Q3J5cHRvUHJv");
var verifyResult = Verify(signedMessage);
if (verifyResult) {
alert("Signature is valid when detached: " + g_bDetached);
} else {
alert("Signature is not valid when detached: " + g_bDetached);
}
}
Проблема в том, что в случае отделенной подписи проверка упорно не проходит, хотя была применена рекомендация на счет указания кодировки до передачи контента (CADESCOM_BASE64_TO_BINARY) от Новожиловой Елены из соседней темы форума. Прошу помочь мне разобраться в проблеме и указать на возможные причины ошибки. Ошибку получаю такую (только в случае g_bDetached = true):
Message from webpage
Failed to verify signature. Error: The hash value is not correct. (-2146889721)
OK --------------------------- Вложение(я): testCades.html (5kb) загружен 24 раз(а).У Вас нет прав для просмотра или загрузки вложений. Попробуйте зарегистрироваться.
|
|
|
|
Статус: Сотрудник
Группы: Администраторы, Участники Зарегистрирован: 10.12.2008(UTC) Сообщений: 924 Откуда: Крипто-Про Поблагодарили: 99 раз в 95 постах
|
Вы в функцию Verify передаете только один параметр - само подписанное сообщение. Вместо: Код:var verifyResult = Verify(signedMessage);
должно быть: Код:var verifyResult = Verify(signedMessage, "Q3J5cHRvUHJv");
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 20.10.2011(UTC) Сообщений: 45 Откуда: Moscow
Сказал(а) «Спасибо»: 7 раз
|
Елена, огромное вам спасибо. Стыдно, что из-за такого промаха в итоге пришлось задать вопрос. Действительно, теперь оба варианта работают.
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 06.07.2011(UTC) Сообщений: 32 Откуда: Москва
|
Дабы не создавать похожую тему.
Использую для проверки подписи Пример 3. Если правильно понимаю, могу ли использовать код ниже ( quote - проверка) узнать (выдать на экран сообщение) подписано или нет, или я бурду подсунул?!Проверка подписи написал: Option Explicit
Const CAPICOM_VERIFY_SIGNATURE_ONLY = 0 Const ForReading = 1
Dim oSignedData Set oSignedData = CreateObject("CAdESCOM.CadesSignedData") ' Загрузка подписанных данных для проверки. Dim Message : Message = LoadFile("kolya.sig") ' Подпись совмещенная. oSignedData.Verify Message, False Function LoadFile (FileName) Dim fso Set fso = CreateObject("Scripting.FileSystemObject") If Not fso.FileExists(FileName) Then Err.Raise vbObjectError+1, "LoadFile", "File not found" End If Dim ts Set ts = fso.OpenTextFile(FileName, ForReading) LoadFile = ts.ReadAll End Function
Проверка написал: function Verify(sSignedMessage, dataToSign) { var oSignedData = CreateObject("CAdESCOM.CadesSignedData"); if (g_bDetached) { oSignedData.ContentEncoding = CADESCOM_BASE64_TO_BINARY; oSignedData.Content = dataToSign; alert("Signature is detached"); } else { alert("Signature is not detached"); } try { oSignedData.VerifyCades(sSignedMessage, CADESCOM_CADES_X_LONG_TYPE_1, g_bDetached); } catch (err) { alert("Failed to verify signature. Error: " + GetErrorMessage(err)); return false; }
return true; }
Отредактировано пользователем 19 октября 2012 г. 16:34:47(UTC)
| Причина: Не указана |
Семья тебя простит... Дон Корлеоне |
|
|
|
Статус: Сотрудник
Группы: Администраторы, Участники Зарегистрирован: 10.12.2008(UTC) Сообщений: 924 Откуда: Крипто-Про Поблагодарили: 99 раз в 95 постах
|
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 07.08.2012(UTC) Сообщений: 123
Сказал(а) «Спасибо»: 4 раз Поблагодарили: 6 раз в 6 постах
|
Столкнулся с ошибкой: Certificates.Select is not a function Не подскажите в чем может быть проблема? P.S. Увидел в справке, что для данного объекта реализованы только следующие методы и свойства: Find, Item, Count. Отредактировано пользователем 14 февраля 2013 г. 12:07:02(UTC)
| Причина: Не указана
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 16.01.2014(UTC) Сообщений: 10
|
Прошло 11 месяцев, а вопрос остался.
var oStore = CreateObject("CAPICOM.Store"); oStore.Open(CAPICOM_CURRENT_USER_STORE, CAPICOM_MY_STORE, CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED); var oCertificates = oStore.Certificates.Select('Выберите сертификат для подписи документа.', 'Выберите один из сертификатов', false);
Почему в IE функция Select работает, а в других браузерах нет? oStore.Certificates возвращает ICertificates3. Там, вроде бы, Select есть.
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,340 Сказал «Спасибо»: 550 раз Поблагодарили: 2212 раз в 1727 постах
|
Автор: NikChaew Прошло 11 месяцев, а вопрос остался.
var oStore = CreateObject("CAPICOM.Store"); oStore.Open(CAPICOM_CURRENT_USER_STORE, CAPICOM_MY_STORE, CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED); var oCertificates = oStore.Certificates.Select('Выберите сертификат для подписи документа.', 'Выберите один из сертификатов', false);
Почему в IE функция Select работает, а в других браузерах нет? oStore.Certificates возвращает ICertificates3. Там, вроде бы, Select есть. Посмотрите на демо-странице функцию ObjCreator из Code.js |
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,340 Сказал «Спасибо»: 550 раз Поблагодарили: 2212 раз в 1727 постах
|
Объект CertificatesЦитата: В отличие от объекта Microsoft CAPICOM.Certificates, для данного объекта реализованы только следующие методы и свойства: Find, Item, Count.
Замечание: В CAdESCOM данный объект доступен только на платформе x64. На платформе win32 следует использовать объект Microsoft CAPICOM.Certificates .
|
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,340 Сказал «Спасибо»: 550 раз Поблагодарили: 2212 раз в 1727 постах
|
Автор: Андрей * Автор: NikChaew Прошло 11 месяцев, а вопрос остался.
var oStore = CreateObject("CAPICOM.Store"); oStore.Open(CAPICOM_CURRENT_USER_STORE, CAPICOM_MY_STORE, CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED); var oCertificates = oStore.Certificates.Select('Выберите сертификат для подписи документа.', 'Выберите один из сертификатов', false);
Почему в IE функция Select работает, а в других браузерах нет? oStore.Certificates возвращает ICertificates3. Там, вроде бы, Select есть. Посмотрите на демо-странице функцию ObjCreator из Code.js и функцию FillCertList(lstId) |
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close