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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline ghostzg  
#1 Оставлено : 30 марта 2018 г. 0:25:33(UTC)
ghostzg

Статус: Новичок

Группы: Участники
Зарегистрирован: 29.03.2018(UTC)
Сообщений: 3
Российская Федерация

Всем, доброго времени суток.

Проблема возможно не нова, но однозначного ответа найти я не смог.

Я создаю отделенную подпись через плагин, на вход подается чистая строка (данные не кодированы):

Код:
signDataAll: function (config) {
		var oStore;
		var res = {
			success: false,
			data: config.content
		};
		try {
			oStore = this.createObject("CAPICOM.store");
			oStore.Open();
		} catch (e) {
			res.error = "Ошибка при открытии хранилища: " + this.getErrorMessage(e);
			return res;
		}

		var oCerts = oStore.Certificates.Find(this.CAPICOM_CERTIFICATE_FIND_TYPE.CAPICOM_CERTIFICATE_FIND_SHA1_HASH, config.thumbprint);
		if (oCerts.Count === 0) {
			return "Не найден сертификат";
		}
		var oCert = oCerts.Item(1);
		/*try {
		 var oSigner = this.createObject("CAdESCOM.CPSigner");
		 oSigner.Certificate = oCert;
		 } catch (e) {
		 res.error = "Ошибка при создания объекта для подписи: " + this.getErrorMessage(e);
		 return res;
		 } */

		//var oSignedData = this.createObject("CAdESCOM.CadesSignedData");
		for (var i = 0; i < res.data.length; i++) {

			try {
				var oSigner = this.createObject("CAdESCOM.CPSigner");
				oSigner.Certificate = oCert;
			} catch (e) {
				res.error = "Ошибка при создания объекта для подписи: " + this.getErrorMessage(e);
				return res;
			}


			var oSignedData = this.createObject("CAdESCOM.CadesSignedData");

			if (res.data[i].dataToSign) {
				oSignedData.Content = res.data[i].dataToSign;
				oSignedData.ContentEncoding = this.CAPICOM_ENCODING_TYPE.CAPICOM_ENCODE_BINARY;
				if (config.tsaAddress) {
					oSigner.TSAAddress = config.tsaAddress;
				}
				oSigner.Options = config.options || this.CAPICOM_CERTIFICATE_INCLUDE_OPTION.CAPICOM_CERTIFICATE_INCLUDE_WHOLE_CHAIN;
				if (Ext.isArray(config.attributes)) {
					Ext.Array.each(config.attributes, function (value) {
						var oAttr = this.createObject("CADESCOM.CPAttribute");
						oAttr.Name = value.name;
						if (Ext.isDate(value.value))
							oAttr.Value = this.convertDate(value.value);
						else
							oAttr.Value = value.value;
						oSigner.AuthenticatedAttributes2.Add(oAttr);
					}, this);
				}

				try {
					res.data[i].signature = oSignedData.SignCades(oSigner, config.cadesType || this.CADESCOM_CADES_TYPE.CADESCOM_CADES_BES, config.detached || false);
					res.data[i].dataToSign = oSignedData.Content;
				}
				catch (e) {
					res.error = "Не удалось создать подпись из-за ошибки: " + this.getErrorMessage(e);
					return res;
				}
			} else {
				res.error = "Не указаны данные для подписания";
				return res;
			}
		}
		oStore.Close();
		res.success = true;
		return res;
	}


проверку осуществляю следующим образом

Код:
verifyAll: function (config) {
		var res = {
			success: false,
			data: config.content
		};

		//var oSignedData = this.createObject("CAdESCOM.CadesSignedData");
		for (var i = 0; i < res.data.length; i++) {

			var oSignedData = this.createObject("CAdESCOM.CadesSignedData");
			try {
				oSignedData.Content = res.data[i].dataToVerify;
				oSignedData.ContentEncoding = this.CAPICOM_ENCODING_TYPE.CAPICOM_ENCODE_BINARY;
				/*originalSignedData dataToVerify*/
				oSignedData.VerifyCades(res.data[i].signature, config.cadesType, config.detached || false);

				res.data[i].signers = this.getSignersArray(oSignedData.Signers);
				res.data[i].status = 'Действительна';

			} catch (e) {
				res.data[i].status = 'Недействительна';
				res.data[i].error = "Не удалось проверить подпись из-за ошибки: " + this.getErrorMessage(e);
				//return res;
			}
		}
		res.success = true;
		return res;
	}


отделенную подпись сохраняю в БД. Все прекрасно работает.

Но не могу проверить подпись с помощью JCP, код следующий:

Код:
public static String verifyCAdESSignature(String dataSource, String signature
            , SignatureType signatureType) throws IOException {


        InputStream dataSourceStream = new ByteArrayInputStream(dataSource.getBytes(StandardCharsets.UTF_8));
        InputStream cadesCmsStream = new ByteArrayInputStream(signature.getBytes());

        try {

            verifyCAdESSignature(dataSourceStream, cadesCmsStream, signatureType);


        } finally {

            dataSourceStream.close();
            cadesCmsStream.close();

        }


        return null;
    }


Код:
public static String verifyCAdESSignature(InputStream dataSource, InputStream signature
            , SignatureType signatureType) {


        try {

            CAdESSignature cadesSignature = new CAdESSignature(signature,
                    dataSource, null);

            cadesSignature.verify(null);

            printSignatureInfo(cadesSignature);

            CAdESSigner[] signers = cadesSignature.getCAdESSignerInfos();

            printCAdESSignersInfo(signers);

        } catch (Exception e) {

            printCAdESException(e);

        }


        return null;
    }


Каждый раз получаю ошибку Unexpected object reading content. (-2).

Подскажите, что я делаю не так ?

Offline Евгений Афанасьев  
#2 Оставлено : 30 марта 2018 г. 10:03:50(UTC)
Евгений Афанасьев

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

Группы: Участники
Зарегистрирован: 06.12.2008(UTC)
Сообщений: 4,004
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 714 раз в 674 постах
Здравствуйте.
Из base64 декодируете?
Offline ghostzg  
#3 Оставлено : 30 марта 2018 г. 10:24:56(UTC)
ghostzg

Статус: Новичок

Группы: Участники
Зарегистрирован: 29.03.2018(UTC)
Сообщений: 3
Российская Федерация

Добрый день.

Подпись ? Нет на момент написания поста не декодировал. Затем вставил:

Код:
 InputStream dataSourceStream = new ByteArrayInputStream(dataSource.getBytes(StandardCharsets.UTF_8));
        InputStream cadesCmsStream = new ByteArrayInputStream(org.bouncycastle.util.encoders.Base64.decode(signature.getBytes()));


Данная ошибка пропала, но появился ряд новых, а именно

can't create content verifier: Error constructing implementation (algorithm: GOST3411withGOST3410EL, provider: JCP, class: ru.CryptoPro.JCP.Sign.GostElSign) (8)

это при первой попытке проверить.

SelfTester Error: some test crashed twice in a row, usage of JCP is no longer available (-2)

при всех последующих до перезагрузки всей машины.

Что именно я делаю не так ?

Отредактировано пользователем 30 марта 2018 г. 14:42:44(UTC)  | Причина: Не указана

Offline Евгений Афанасьев  
#4 Оставлено : 30 марта 2018 г. 16:54:41(UTC)
Евгений Афанасьев

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

Группы: Участники
Зарегистрирован: 06.12.2008(UTC)
Сообщений: 4,004
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 714 раз в 674 постах
Jcp установлен штатным способом под управлением учетной записи администратора?
Offline ghostzg  
#5 Оставлено : 30 марта 2018 г. 17:13:49(UTC)
ghostzg

Статус: Новичок

Группы: Участники
Зарегистрирован: 29.03.2018(UTC)
Сообщений: 3
Российская Федерация

Да но как оказалось я ставил пакет от jcsp, после переустановки на обычный jcp проблема с
can't create content verifier: Error constructing implementation (algorithm: GOST3411withGOST3410EL, provider: JCP, class: ru.CryptoPro.JCP.Sign.GostElSign) (8)
и
SelfTester Error: some test crashed twice in a row, usage of JCP is no longer available (-2)
Решилась.
Но возникла следующая, при попытке проверить подпись получаю:
org.bouncycastle.cms.CMSSignerDigestMismatchException: message-digest attribute value does not match calculated value, errors: 'Signature is invalid' (8)

Я так понимаю, это потому, что подписываю и проверяю подпись на стороне плагина в кодировке по умолчанию.

Что мне нужно сделать на стороне jcp, чтобы проверка подписи происходила корректно ?

Подпись отделенная. На вход приходит обычная строка как в плагин так и в jcp.


Код:
try {

            CAdESSignature cadesSignature = new CAdESSignature(signature,
                    dataSource, CAdESType.CAdES_BES);

            cadesSignature.verify(null);

            printSignatureInfo(cadesSignature);

            CAdESSigner[] signers = cadesSignature.getCAdESSignerInfos();

            printCAdESSignersInfo(signers);

        } catch (Exception e) {

            printCAdESException(e);

        }


Сертификаты встроены в подпись, но вот список ото званых сертификатов походу нужно все же подать на вход.
Offline Евгений Афанасьев  
#6 Оставлено : 2 апреля 2018 г. 13:23:56(UTC)
Евгений Афанасьев

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

Группы: Участники
Зарегистрирован: 06.12.2008(UTC)
Сообщений: 4,004
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 714 раз в 674 постах
Возможно, причина ошибки в этом: http://cpdn.cryptopro.ru...s/content-encoding.html:
Код:

При использовании КриптоПро ЭЦП Browser plug-in данные, переданные при создании подписи, будут перекодированы в UCS-2 little endian и именно в таком виде данные будут подписаны. Это сделано для совместимости с теми ЭП, которые были созданы в Internet Explorer с использованием CAPICOM.
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.