Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

3 Страницы123>
Опции
К последнему сообщению К первому непрочитанному
Offline EVoynov  
#1 Оставлено : 22 марта 2012 г. 18:30:44(UTC)
EVoynov

Статус: Активный участник

Группы: Участники
Зарегистрирован: 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 раз(а).

У Вас нет прав для просмотра или загрузки вложений. Попробуйте зарегистрироваться.
Offline Новожилова Елена  
#2 Оставлено : 22 марта 2012 г. 20:03:12(UTC)
Новожилова Елена

Статус: Сотрудник

Группы: Администраторы, Участники
Зарегистрирован: 10.12.2008(UTC)
Сообщений: 924
Женщина
Откуда: Крипто-Про

Поблагодарили: 99 раз в 95 постах
Вы в функцию Verify передаете только один параметр - само подписанное сообщение.

Вместо:
Код:
var verifyResult = Verify(signedMessage);

должно быть:
Код:
var verifyResult = Verify(signedMessage, "Q3J5cHRvUHJv");

Offline EVoynov  
#3 Оставлено : 22 марта 2012 г. 20:18:55(UTC)
EVoynov

Статус: Активный участник

Группы: Участники
Зарегистрирован: 20.10.2011(UTC)
Сообщений: 45
Откуда: Moscow

Сказал(а) «Спасибо»: 7 раз
Елена, огромное вам спасибо. Стыдно, что из-за такого промаха в итоге пришлось задать вопрос. Действительно, теперь оба варианта работают.
Offline dennioushen  
#4 Оставлено : 19 октября 2012 г. 15:47:26(UTC)
dennioushen

Статус: Активный участник

Группы: Участники
Зарегистрирован: 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)  | Причина: Не указана

Семья тебя простит... Дон Корлеоне
Offline Новожилова Елена  
#5 Оставлено : 23 октября 2012 г. 18:32:53(UTC)
Новожилова Елена

Статус: Сотрудник

Группы: Администраторы, Участники
Зарегистрирован: 10.12.2008(UTC)
Сообщений: 924
Женщина
Откуда: Крипто-Про

Поблагодарили: 99 раз в 95 постах
Не поняла, в чем вопрос.
Offline dmishin  
#6 Оставлено : 14 февраля 2013 г. 12:04:35(UTC)
dmishin

Статус: Активный участник

Группы: Участники
Зарегистрирован: 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)  | Причина: Не указана

Offline NikChaew  
#7 Оставлено : 16 января 2014 г. 22:18:16(UTC)
NikChaew

Статус: Участник

Группы: Участники
Зарегистрирован: 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 есть.
Offline Андрей Писарев  
#8 Оставлено : 16 января 2014 г. 22:29:59(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 13,237
Мужчина
Российская Федерация

Сказал «Спасибо»: 545 раз
Поблагодарили: 2189 раз в 1710 постах
Автор: 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
Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей Писарев  
#9 Оставлено : 16 января 2014 г. 22:36:42(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 13,237
Мужчина
Российская Федерация

Сказал «Спасибо»: 545 раз
Поблагодарили: 2189 раз в 1710 постах

Объект Certificates
Цитата:

В отличие от объекта Microsoft CAPICOM.Certificates,
для данного объекта реализованы только следующие методы и свойства: Find, Item, Count.

Замечание:
В CAdESCOM данный объект доступен только на платформе x64. На платформе win32 следует использовать объект Microsoft CAPICOM.Certificates .

Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей Писарев  
#10 Оставлено : 16 января 2014 г. 22:38:30(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 13,237
Мужчина
Российская Федерация

Сказал «Спасибо»: 545 раз
Поблагодарили: 2189 раз в 1710 постах
Автор: Андрей * Перейти к цитате
Автор: 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)
Техническую поддержку оказываем тут
Наша база знаний
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest (4)
3 Страницы123>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.