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

Уведомление

Icon
Error

5 Страницы«<2345>
Опции
К последнему сообщению К первому непрочитанному
Offline Андрей *  
#31 Оставлено : 26 августа 2020 г. 23:43:53(UTC)
Андрей *

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

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

Сказал «Спасибо»: 494 раз
Поблагодарили: 2035 раз в 1579 постах
(detached==True. Почему? До этого утверждали, что присоединенную нужно отправлять. Плагин на той странице формирует присоединенную.

Покажите технические требования этого сервера к cms. Файлы сравню позже
Техническую поддержку оказываем тут
Наша база знаний
Offline Dreamir  
#32 Оставлено : 26 августа 2020 г. 23:52:52(UTC)
Dreamir

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

Группы: Участники
Зарегистрирован: 08.07.2020(UTC)
Сообщений: 26
Российская Федерация
Откуда: Пермь

Надо формировать отсоединённую. Присылал файлы подписей с присоединённой - это были эксперименты, потому что не понимал что не так.
Подпись для сервера формируется тут: https://login.sberbank-a...s/cadescom/async_code.js метод SignDataCadesBES_Async

Отредактировано пользователем 26 августа 2020 г. 23:54:41(UTC)  | Причина: Не указана

Offline Андрей *  
#33 Оставлено : 27 августа 2020 г. 0:08:57(UTC)
Андрей *

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

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

Сказал «Спасибо»: 494 раз
Поблагодарили: 2035 раз в 1579 постах
Да, под Windows всё проверяется, через MS CryptoAPI, в том числе и через КриптоАРМ.

Snimok ehkrana ot 2020-08-27 00-55-17.png (17kb) загружен 4 раз(а).



Но, в файле от java-приложения - некорректная структура ASN.1
вот что выдаёт ASN1.dump "5 errors" (слева от java, справа от плагина)

Snimok ehkrana ot 2020-08-27 00-54-35.png (23kb) загружен 10 раз(а).


Далее, если сравнивать ASN.1

Плагин:
ObjectID алгоритма: 1.2.643.7.1.1.1.1 ГОСТ Р 34.10-2012 256 бит
Алгоритм ГОСТ Р 34.10-2012 для ключей длины 256 бит, используемый при экспорте/импорте ключей

Цитата:

7305 $30 SEQUENCE: ==>12
7307 $06 OBJID: 1.2.643.7.1.1.1.1
7317 $05 NULL:
7319 $04 OCTSTR: 0B043DA930E523D441C8E12F3842BD58923595E10D73D9C6E3224CEAC37321F04365AA89D25CFB823203A359D309373CCA5BFE66EF58802CBB65B35EF24DD436






Java-приложение:
ObjectID алгоритма: 1.2.643.7.1.1.6.1 ГОСТ Р 34.10-2012 DH 256 бит
Алгоритм Диффи-Хеллмана на базе эллиптической кривой для ключей длины 256 бит


Цитата:

7245 $30 SEQUENCE: ==>10
7247 $06 OBJID: 1.2.643.7.1.1.6.1
7257 $04 OCTSTR: D93A27B359A75D08C52E6624424CFE8E1D987C220CA5690332AF6383047E042D4D29B35EFB67E18622570D7E06CAA125A09D9685675B8DA2E332C42EE6C60D44
7323 $00 unknown[0]:
7325 $00 unknown[0]:
7327 $00 unknown[0]:
Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей *  
#34 Оставлено : 27 августа 2020 г. 0:19:03(UTC)
Андрей *

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

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

Сказал «Спасибо»: 494 раз
Поблагодарили: 2035 раз в 1579 постах
+ Еще вариант:
неправильно формируется ASN.1 в коде\записывается в файл,
в конце файла вижу 6 байт 0

Snimok ehkrana ot 2020-08-27 01-14-59.png (20kb) загружен 6 раз(а).


предлагаю выложить код, которым формируется и записывается в файл.

На принимающей стороне, вероятно, проверяется полностью структура ASN.1 (т.е. до самой проверки корректности подписанного хеша не доходит).




Техническую поддержку оказываем тут
Наша база знаний
Offline Dreamir  
#35 Оставлено : 27 августа 2020 г. 0:23:50(UTC)
Dreamir

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

Группы: Участники
Зарегистрирован: 08.07.2020(UTC)
Сообщений: 26
Российская Федерация
Откуда: Пермь

Код:

     public static String signed(String data, boolean detached) throws IOException, KeyStoreException, NoSuchAlgorithmException, CertificateException, UnrecoverableKeyException, CAdESException, InvalidKeyException, SignatureException {
        final byte src[] = data.getBytes(StandardCharsets.UTF_16LE);

        KeyStore keyStore = KeyStore.getInstance( cer_story );
        keyStore.load( null, null );
        PrivateKey privateKey = (PrivateKey) keyStore.getKey( cer_alias, cer_pass );
        X509Certificate cert = (X509Certificate) keyStore.getCertificate( cer_alias );
        List<X509Certificate> chain = Arrays.asList( cert );

        CAdESSignature cadesSignature = new CAdESSignature(detached);

        // Создаем подписанта CAdES-BES.
        cadesSignature.addSigner(
                "JCP", "1.2.643.7.1.1.2.2", "1.2.643.7.1.1.6.1",
                privateKey, chain, CAdESType.CAdES_BES, null, false,
                null, null, null, true
        );
        return extractBase64Sign(cadesSignature, src);
    }

    private static String extractBase64Sign(CAdESSignature cadesSignature, final byte[] src) throws CAdESException, IOException {
        // Будущая подпись в виде массива.
        ByteArrayOutputStream signatureStream = new ByteArrayOutputStream();
        // Подготовка контекста.
        cadesSignature.open(signatureStream);
        // Хеширование.
        cadesSignature.update(src);
        // Создание подписи с выводом в signatureStream.
        cadesSignature.close();
        signatureStream.close();
        // Получаем подпись в виде массива.
        byte[] cadesCms = signatureStream.toByteArray();
        return Base64.getEncoder().encodeToString(cadesCms);
    }

Отредактировано пользователем 27 августа 2020 г. 0:24:24(UTC)  | Причина: Не указана

Offline Андрей *  
#36 Оставлено : 27 августа 2020 г. 0:46:30(UTC)
Андрей *

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

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

Сказал «Спасибо»: 494 раз
Поблагодарили: 2035 раз в 1579 постах
Цитата:
"JCP", "1.2.643.7.1.1.2.2", "1.2.643.7.1.1.6.1",


Есть обоснование, почему именно такие идентификаторы нужны?
Техническую поддержку оказываем тут
Наша база знаний
Offline Dreamir  
#37 Оставлено : 27 августа 2020 г. 1:17:30(UTC)
Dreamir

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

Группы: Участники
Зарегистрирован: 08.07.2020(UTC)
Сообщений: 26
Российская Федерация
Откуда: Пермь

Автор: Андрей * Перейти к цитате
Цитата:
"JCP", "1.2.643.7.1.1.2.2", "1.2.643.7.1.1.6.1",


Есть обоснование, почему именно такие идентификаторы нужны?


Если меняю 1.2.643.7.1.1.6.1 на 1.2.643.7.1.1.1.1 то падает исключение на то что ожидается 1.2.643.7.1.1.6.1. Или вообще не указывать? null проставить?
Online Санчир Момолдаев  
#38 Оставлено : 27 августа 2020 г. 10:33:08(UTC)
Санчир Момолдаев

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

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

Сказал(а) «Спасибо»: 88 раз
Поблагодарили: 223 раз в 211 постах
по поводу оидов посмотрите нижеприведенный код. использую другой конструктор.
возможно еще что на той стороне ожидается вся цепочка подписанта в подписи. т.к. плагин ложит всю цепочку в подпись
Код:

...
        Certificate[] chain = keyStore.getCertificateChain(ALIAS);
        X509Certificate[] xChain = new X509Certificate[chain.length];
        System.arraycopy(chain, 0, xChain, 0, chain.length);

        Collection<X509CertificateHolder> certHolders = new ArrayList<X509CertificateHolder>(chain.length);
        for (Certificate cert : chain) {
            certHolders.add(new X509CertificateHolder(cert.getEncoded()));
        }
        CollectionStore store = new CollectionStore(certHolders);

        ByteArrayOutputStream signature = new ByteArrayOutputStream();
        CAdESSignature cAdESSignature = new CAdESSignature(true); // true detached ; false attached
        cAdESSignature.addSigner(
                JCP.PROVIDER_NAME,
                privateKey,
                Arrays.asList(xChain),
                CAdESType.CAdES_BES,
                null,
                false);
        cAdESSignature.open(signature);
        cAdESSignature.update(data);
        cAdESSignature.setCertificateStore(store); //установка цепочки в подпись
        cAdESSignature.close();
Техническую поддержку оказываем тут
Наша база знаний
Offline Dreamir  
#39 Оставлено : 7 сентября 2020 г. 13:38:36(UTC)
Dreamir

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

Группы: Участники
Зарегистрирован: 08.07.2020(UTC)
Сообщений: 26
Российская Федерация
Откуда: Пермь

Перепробовал разные варианты. Не получается. Код клиентской части на js ниже. Надо консольное приложение на java которое бы формировало точно такую же подпись.
Что ещё упустили?
Код:

	cadesplugin.async_spawn(function*(arg) {
		var sData = arg[0];
		var sCertHash = arg[1]; 
		var contentEndoding = arg[2];

		if(sCertHash == "")
			return signData_reject("Передан пустой отпечаток сертификата");
		if(sData == null || sData == "")
			return signData_reject("Не задано содержание для подписания");
		var certificate;
		try{
			certificate = yield GetCertificate_Async(sCertHash);
			var info = yield GetCertInfo_Async(certificate);
		}
		catch(ex){
			return signData_reject();
		}

		try{
			var oSigner, oSignedData;
			try {
				oSigner = yield cadesplugin.CreateObjectAsync("CAdESCOM.CPSigner");
				oSignedData = yield cadesplugin.CreateObjectAsync("CAdESCOM.CadesSignedData");
			} 
			catch (err) {
				return signData_reject("Невозможно создать объекты CAdESCOM: " + GetErrorMessage(err));
			}

			if (oSigner) {
				yield oSigner.propset_Certificate(certificate);
			}
			else 
			{
				return signData_reject("Невозможно создать объект CAdESCOM.CPSigner");
			}
			//Тут муть, пока коментим
			var oSigningTimeAttr = yield cadesplugin.CreateObjectAsync("CADESCOM.CPAttribute");
			yield oSigningTimeAttr.propset_Name(CAPICOM_AUTHENTICATED_ATTRIBUTE_SIGNING_TIME);
			var oTimeNow = new Date();
			yield oSigningTimeAttr.propset_Value(oTimeNow);
			var attr = yield oSigner.AuthenticatedAttributes2;
			oTimeNow = null;
			yield attr.Add(oSigningTimeAttr); 
			if(contentEndoding != undefined){
				yield oSignedData.propset_ContentEncoding(contentEndoding);
			}
			yield oSignedData.propset_Content(sData);
			yield oSigner.propset_Options(1); //CAPICOM_CERTIFICATE_INCLUDE_WHOLE_CHAIN
			try {
				Signature = yield oSignedData.SignCades(oSigner, CADESCOM_CADES_BES, true, CAPICOM_ENCODE_BASE64);

				if (Signature == null || Signature == undefined || Signature == false) {
					Signature = "";
				}
				return signData_resolve(Signature);
			}
			catch(err)
			{
				return signData_reject("Произошла ошибка: " + GetErrorMessage(err));
			}
		}
		catch(err){
			return signData_reject("Произошла ошибка: " + GetErrorMessage(err));
		}
	}, sDataArg, sCertHashArg, contentEndodingArg); 
		return result;
	}

Отредактировано пользователем 7 сентября 2020 г. 13:39:10(UTC)  | Причина: Не указана

Offline Dreamir  
#40 Оставлено : 7 сентября 2020 г. 14:07:13(UTC)
Dreamir

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

Группы: Участники
Зарегистрирован: 08.07.2020(UTC)
Сообщений: 26
Российская Федерация
Откуда: Пермь

Какой конструктор и параметры cAdESSignature.addSigner нужно использовать чтобы результат получился как от работы js кода выше???
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
5 Страницы«<2345>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.