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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Стрелков Сергей  
#1 Оставлено : 22 октября 2025 г. 18:10:41(UTC)
Стрелков Сергей

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

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

Сказал(а) «Спасибо»: 6 раз
Добрый день.

В документации не нашел примера создания архивной подписи в браузере(Crypto Pro Browser Plugin).

В исходном коде(архив demopage),нашел небольшую информацию о создании данного вида подписи ,но не уверен в корректности воссозданного мной кода.

Есть ли пример создания данного вида подписи для долгосрочного архивирования на JS ?

Вот что я вычитал относительно того ,что должна обязательно иметь архивная подпись :
1. TSA (штамп времени)
2. Полная цепочка сертификатов
3. OCSP/CRL-ответы
4. Атрибут времени подписи
5. Атрибут имени документа
6. Архивные атрибуты


Пункты 1, 2, 4, 5 - в коде задаются явно
Пункт 3 - на сколько я понял он задается неявно(адреса серверов берутся из сертификата и в зависимости от типа подписи CadesXLongType1 или CadesA добавляются автоматичсеки)
Пунтк 6 - о каких атрибутах идет речь?
Заранее спасибо!
Ниже текущая(моя) реализации:

Код:
  certificate?: CryptoProCertificate;
  rawBase64ToSign?: string;
  tspURL: string;
  docName: string;
};

export const createCadesAType = async (params: ParamsType) => {
  const CP_SIGNER = 'CAdESCOM.CPSigner';
  const SIGNED_DATA = 'CAdESCOM.CadesSignedData';
  const CP_ATTRIBUTE = 'CADESCOM.CPAttribute';

  const plugin = window.cadesplugin;

  const { certificate, rawBase64ToSign, tspURL, docName } = params;
  try {
    if (!plugin) {
      throw new Error('Плагин не доступен');
    }
    if (!certificate) {
      throw new Error('Сертификат обязателен для подписи');
    }
    if (!rawBase64ToSign) {
      throw new Error('Данные для подписи обязательны');
    }

    const cpSigner: CPSigner = await plugin.CreateObjectAsync!(CP_SIGNER);
    await cpSigner.propset_Certificate(certificate.__CadesCertificate);
    await cpSigner.propset_Options(plugin.CAPICOM_CERTIFICATE_INCLUDE_WHOLE_CHAIN); // Полная цепочка сертификатов
    await cpSigner.propset_CheckCertificate(true);
    await cpSigner.propset_TSAAddress(tspURL); // TSA (штамп времени)

    const attr: AuthenticatedAttributes = await cpSigner.AuthenticatedAttributes2;

    const timeAttr: CPAttribute = await plugin.CreateObjectAsync!(CP_ATTRIBUTE);
    await timeAttr.propset_Name(plugin.CAPICOM_AUTHENTICATED_ATTRIBUTE_SIGNING_TIME);
    await timeAttr.propset_Value(new Date());
    await attr.Add(timeAttr); // Атрибут времени подписи

    const docNameAttr: CPAttribute = await plugin.CreateObjectAsync!(CP_ATTRIBUTE);
    await docNameAttr.propset_Name(plugin.CADESCOM_AUTHENTICATED_ATTRIBUTE_DOCUMENT_NAME);
    await docNameAttr.propset_Value(docName);
    await attr.Add(docNameAttr); // Атрибут имени документа

    const signedData: CadesSignedData = await plugin.CreateObjectAsync!(SIGNED_DATA);
    await signedData.propset_ContentEncoding(plugin.CADESCOM_BASE64_TO_BINARY);
    await signedData.propset_Content(rawBase64ToSign);

    const signature = await signedData.SignCades(cpSigner, plugin.CADESCOM_CADES_A, true); // Создаем открепленную подпись типа CADES-A

    await signedData.VerifyCades(signature, plugin.CADESCOM_CADES_A, true); // Проверяем созданную подпись
    return signature;
  } catch (error) {
    let message = '';
    if (plugin) {
      message = `Ошибка при создании подписи CADES-A: ${plugin.getLastError(error)}`;
    } else {
      message = `${(error as Error)?.message ?? 'Ошибка'}`;
    }
    throw new Error(message);
  }
};

Отредактировано пользователем 22 октября 2025 г. 18:14:51(UTC)  | Причина: Не указана

Offline Андрей *  
#2 Оставлено : 22 октября 2025 г. 18:56:10(UTC)
Андрей *

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

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

Сказал «Спасибо»: 603 раз
Поблагодарили: 2346 раз в 1842 постах
Здравствуйте.

В архиве с демо-страницами или онлайне примере\документации - достаточно CADESCOM_CADES_A указать, вместо CAdES-X Long Type 1,
всё остальное формируется внутри.

timeAttr - можно не прописывать в коде, добавится локальное, что равнозначно new Date() (либо использовать "внешний источник правильного времени, не ориентироваться на локальное, но смысл - если рядом будет штамп времени лежать)
Техническую поддержку оказываем тут
Наша база знаний
thanks 1 пользователь поблагодарил Андрей * за этот пост.
Стрелков Сергей оставлено 23.10.2025(UTC)
Offline Новожилова Елена  
#3 Оставлено : 22 октября 2025 г. 19:35:09(UTC)
Новожилова Елена

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

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

Поблагодарили: 115 раз в 104 постах
Архивные атрибуты - имеется в виду атрибут ATS-hash-indexV3 и сам архивный штамп.
Вручную их добавлять не нужно, достаточно указать тип подписи CADESCOM_CADES_A

Отредактировано пользователем 22 октября 2025 г. 19:36:07(UTC)  | Причина: Не указана

thanks 1 пользователь поблагодарил Новожилова Елена за этот пост.
Стрелков Сергей оставлено 23.10.2025(UTC)
Offline Стрелков Сергей  
#4 Оставлено : 23 октября 2025 г. 9:49:13(UTC)
Стрелков Сергей

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

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

Сказал(а) «Спасибо»: 6 раз
Спасибо огромное за ликбез.
И еще один вопрос, версия плагина для создания данной подписи играет роль?

Там же в коде нашел комментарий ,что создать подпись типа CADES-A версия плагина должна быть не ниже '2.0.15260'
Offline Андрей *  
#5 Оставлено : 23 октября 2025 г. 15:37:02(UTC)
Андрей *

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

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

Сказал «Спасибо»: 603 раз
Поблагодарили: 2346 раз в 1842 постах
Автор: Стрелков Сергей Перейти к цитате
Спасибо огромное за ликбез.
И еще один вопрос, версия плагина для создания данной подписи играет роль?

Там же в коде нашел комментарий ,что создать подпись типа CADES-A версия плагина должна быть не ниже '2.0.15260'


Да, поэтому есть примечание в коде.
Техническую поддержку оказываем тут
Наша база знаний
thanks 1 пользователь поблагодарил Андрей * за этот пост.
Стрелков Сергей оставлено 24.10.2025(UTC)
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.