admin / 23.06.2020

Невозможно подписать документ.

    • Содержание

      Настройка КриптоПро ЭЦП

      • Инструкция по настройке окружения для использования КриптоПро ЭЦП Browser plug-in
      • Проверка конфигурации для работы с ЭЦП системы ФИАС
    • Прохождение регистрации

      • При прохождении регистрации, на этапе добавления документов, страница зависает.
        • Процедура регистрации должна производиться в браузере Internet Explorer версии 9 и выше. Если на этапе приложения документов на странице регистрации система зависает, необходимо проверить установленный в браузер режим эмуляции на соответствие требованиям. Необходимо на странице с возникающей ошибкой запустить режим «Средства разработчика»(кнопка F12), далее переходим к разделу «Эмуляция» (Ctrl +8). Установленный режим совместимости для браузера версии 9 и 10 должен соответствовать 9, для браузера версии 11 — Edge или 9.
    • Авторизация

      • Проверка создания электронной подписи CAdES-BES
        • Для проверки возможности создания электронной подписи Вы можете воспользоваться внешним сервисом https://www.cryptopro.ru/sites/default/files/products/cades/demopage/cades_bes_sample.html
      • Действие «Ваш сертификат проверяется» не завершается или «Не удалось выполнить асинхронную операцию»
        • 1. В настройках браузера произведите очистку временных файлов браузера (кеш страниц) и файлов cookie (Сервис – Свойства обозревателя – Общие – История просмотра – Удалить) 2. Повторите попытку авторизации При сохранении проблемы направьте обращении в адрес технической поддержки сопровождаемое скриншотом возникающей ошибки, также попробуйте произвести процедуру авторизации в другом браузере При необходимости произведите проверку ЭЦП с использованием сервиса https://www.gosuslugi.ru/pgu/eds/
      • Ошибка при открытии хранилища: Невозможно создание объекта сервером программирования объектов
        • Ошибка может возникать если:
          — Используемая страница системы не добавлена в доверенные;
          — Версия используемого плагина не является актуальной.

      • Ошибка «Плагин загружен, но не создаются объекты»
        • Ошибка может возникать если:
          — Используемая страница системы не добавлена в доверенные;
          — Версия используемого плагина не является актуальной.

      • Произошла ошибка: Не удается построить цепочку сертификатов для доверенного корневого центра
        • Необходимо установить сертификаты ключей проверки электронной подписи:
          • Цепочку КСКПЭП, начиная от КСКПЭП УЦ, непосредственно выдавшего пользователю его КСКПЭП, и до корневого КСКПЭП, последнего в цепочке сертификатов, установить в соответствующие хранилища:
          • Самоподписанный (поле «Кому выдан» совпадает с полем «Кем выдан») квалифицированный сертификат ключа проверки электронной подписи (КСКПЭП) удостоверяющего центра, — в хранилище сертификатов «Доверенные корневые центры»;
          • Остальные сертификаты цепочки — в хранилище сертификатов «Промежуточные центры сертификации».
          • КСКПЭП, выданный пользователю удостоверяющим центром, аккредитованным в соответствии с требованиями Федерального закона № 63-ФЗ, — в хранилище сертификатов «Личные».

          Если цепочка сертификатов установлена верно и вы проходите авторизацию на сайте – значит не удалось связаться с точкой распределения списка отзыва(CRL) указанной в сертификате и предупреждение носит рекомендательный характер.

      • Ошибка «Не удалось создать подпись из-за ошибки: A certificate chain could not be built to a trusted root authority.» или Ошибка «Не построена цепочка сертификатов до доверенного корневого центра сертификации»
        • Необходимо установить сертификаты ключей проверки электронной подписи:
          • Цепочку КСКПЭП, начиная от КСКПЭП УЦ, непосредственно выдавшего пользователю его КСКПЭП, и до корневого КСКПЭП, последнего в цепочке сертификатов, установить в соответствующие хранилища:
          • Самоподписанный (поле «Кому выдан» совпадает с полем «Кем выдан») квалифицированный сертификат ключа проверки электронной подписи (КСКПЭП) удостоверяющего центра, — в хранилище сертификатов «Доверенные корневые центры»;
          • Остальные сертификаты цепочки — в хранилище сертификатов «Промежуточные центры сертификации».
          • КСКПЭП, выданный пользователю удостоверяющим центром, аккредитованным в соответствии с требованиями Федерального закона № 63-ФЗ, — в хранилище сертификатов «Личные».

          Если цепочка сертификатов установлена верно и вы проходите авторизацию на сайте – значит не удалось связаться с точкой распределения списка отзыва(CRL) указанной в сертификате и предупреждение носит рекомендательный характер.

      • Ошибка «Не удалось создать подпись из-за ошибки: Cannot find the certificate and private key for decryption»
        • Ошибка «Не удалось создать подпись из-за того, что не удается найти сертификат и секретный ключ для дешифрования. Вы используете открытый ключ сертификата.

      • Необходимый сертификат отсутствует в списке выбора сертификата
        • Сертификат может отсутствовать в списке выбора сертификата по причине того, что является просроченным, у сертификата не установлен путь сертификации или из-за отсутствия секретного ключа в сертификате.

      • Плагин недоступен
        • КриптоПро ЭЦП Browser plug-in не установлен или не активирован в текущем браузере, установите/активируйте КриптоПро ЭЦП Browser plug-in

    • Вопросы по регистрации и авторизации уполномоченных органов

      • Ключ ЭЦП выдан на главу ОМСУ/ОГВ, а сведения о существующем личном кабинете, авторизация в котором осуществлялась по логину и паролю, принадлежат представителю, ЭЦП на которого выпущено не будет.
        • 1. Необходимо осуществить попытку авторизации в системе ФИАС с сертификатом на главу ОМСУ/ОГВ.
          2. Система предложит ввести логин и пароль для дальнейшей авторизации.
          3. Укажите логин и пароль от существующего личного кабинета сотрудника.
          4. Система выдаст регистрационый номер Вашей организации в системе ФИАС и предложит сформировать заявку на изменение сведений в электронном виде.
          5. Сформируйте заявку на изменение сведений об организации.

          — Если необходимо сохранить сведения (заявки) в ЛК существующего пользователя, для которого есть только логин и пароль, в заявке на изменение сведений необходимо в окне редактирования представителя
          организации указать «изменить» и выбрать из списка представителей организации необходимого представителя и внести сведения о новом пользователе (главе ОМСУ), которому необходимо присвоить существующий личный кабинет.

          — Если необходимо создать отдельный ЛК на главу ОМСУ, то в заявке необходимо указать «добавить» и внести сведения о новом представителе организации.

          Возможность подачи заявки на изменение в электронном виде для пользователей использующих ЭЦП главы ОМСУ доступна в том случае, если Вы знаете логин и пароль для прежней учетной записи любого другого сотрудника являющегося представителем той же организации, что и руководитель ОМСУ/ОГВ. В случае, если логин или пароль от существующего личного кабинета утрачен, Вы можете сформировать заявку на изменение сведений об организации на бумажном носителе и представить ее к рассмотрению оператору ФИАС в Инспекции Федеральной Налоговой Службы в которой зарегистрирована Ваша организация.

          Для формирования заявки на бумажном носителе необходимо указать регистрационный номер организации в системе ФИАС.

      • Регистрация пользователей.
        • Добавление нового пользователя производится через заявку на изменение организации в добавлении сведений о представителей с признаком «добавить». Заявку на регистрацию создавать не нужно, т.к. Это приводит к регистрации новой организации, а не пользователя.

    • Адресные заявки

      • При формировании заявки об адресном объекте на стадии приложения нормативного документа система зависает.
        • В настоящее время приложение нормативного документа успешно реализовано в браузерах Internet Explorer версии 10 и выше и Google Chrome.
    • Удаление временных файлов браузера

      • Временные файлы (Кэш).
        • Временные файлы (Кэш) — это хранящиеся на вашем компьютере файлы, позволяющие ускорить загрузку часто посещаемых страниц. К ним относятся стили CSS, графическое содержимое и пр. Однако, иногда объемный и старый кэш вносит прямо противоположный эффект. В этом случае его стоит удалить (очистить).
          Internet Explorer
          1. Откройте Internet Explorer, зайдите в меню «Сервис» или воспользуйтесь сочетанием клавиш Ctrl + Shift + Del;
          2. Выберите «Свойства браузера»;
          3. В открывшемся окне настроек перейдите на вкладку «Общие»;
          4. Нажмите кнопку «Удалить…»;
          5. В появившемся окне отметьте пункт «Временные файлы Интернета и веб-сайтов»;
          6. Нажмите «Удалите»;
          7. Закройте свойства программы, нажав кнопку «ОК»;
          8. Перезапустите Internet Explorer и повторите действия на сайте.
          Mozilla Firefox
          1. Откройте Firefox, нажмите кнопку меню (три горизонтальные полоски в верхнем правом углу экрана) и выберите настройки или воспользуйтесь сочетанием клавиш Ctrl + Shift + Del;
          2. В верху выберите вкладку «Приватность»;
          3. В открывшейся форме в разделе «История» выберите параметр «Будет запоминать историю»;
          4. Нажмите «Удалить вашу недавнюю историю»;
          5. В появившемся окне выберите временной интервал «Все», оставьте галочку только на «Кэш»;
          6. Нажмите «Удалить сейчас»;
          7. Перезапустите Firefox и повторите действия на сайте.
          Google Chrome
          1. Откройте меню Google Chrome (три горизонтальные полоски в верхнем правом углу экрана) или воспользуйтесь сочетанием клавиш Ctrl + Shift + Del;
          2. Выберите пункт «Настройки»;
          3. В нижней части окна нажмите на «Показать дополнительные настройки»
          4. Нажмите кнопку «Очистить историю…»
          5. Выберите временной промежуток «За все время», галочкой отметьте «Изображения и другие файлы, сохраненные в кеше» 6. Нажмите «Очистить историю»
          7. Перезапустите Google Chrome и повторите действия на сайте.
    • Нормативно-справочная информация

      • Разделение документов на нормативные и технические
        • Атрибут «тип документа» используется для указания к какому типу документов он относится: технический, либо нормативный. При добавлении документа необходимо указывать к какому типу он относится. Проставление данного признака является обязательным.
          Документ определяется как технический при создании адресной заявки на редактирование/групповое редактирование адресных объектов, если меняют следующие реквизиты: ОКТМО, ОКАТО, почтовый индекс, коды ИФНС.
          В групповом изменении домов при изменении родительского объекта, заявка считается групповым переподчинением, в данном случае документ должен быть нормативным. В одиночном изменении объектов при изменении наименования, номерной части, типа, уровня объекта, кадастрового номера, родительского объекта (переподчинение), документ прикладывается нормативный.
          Нормативный документ прикладывается ко всем остальным типам заявок. Таким как добавление/групповое добавление, удаление, разделение, объединение, восстановление.
          На странице нормативно-справочной информации изменение типа документа возможно:
          1) Через кнопки «Нормативный документ», «Технический документ». Данный признак массово проставляется всем выбранным документам.
          Внимание! При смене признака документа таким образом, признак изменится у всех документов, приложенных к адресным заявкам, а также у адресных объектов.
          2) Через форму одиночного редактирования документа. В данном случае создаётся новая версия документа и признак проставится только у нее. У предыдущей версии останется признак, который был определен ранее.

    • Делегирование полномочий

      • Описание режима делегирования полномочий
        • При делегировании себе полномочий, убедитесь, что та организация, ОКТМО которой Вы хотите делегировать, больше не будет вносить сведения в ГАР.
          Делегирование полномочий — это расширение полномочий организаций ОМСУ , за счёт присвоения кода ОКТМО. Код ОКТМО может быть присвоен, делегирован, от уже зарегистрированной в ФИАС организации, при такой процедуре организация делегировавшая свои полномочия,свой код ОКТМО, не сможет вносить и редактировать сведения в ГАР.
          Также организация может расширить свои полномочия путём присвоения себе кода ОКТМО за которым не зарегистрирована организация.

Часто задаваемые вопросы / Ошибки при работе с ЭП

Ошибка №1. «Не удается построить цепочку сертификатов», «Произошла внутренняя ошибка в цепочке сертификатов» или «Ошибка при проверке сертификата, возможно один из цепочки сертификатов недействителен»

Возможная причина:
Не установлен корневой сертификат вашего Удостоверяющего Центра (УЦ).

Ваши действия:
Установить корневой сертификат Удостоверяющего центра.
Подробную инструкцию можете скачать здесь

Ошибка №2. Failed to create CPSigner

Возможные причины:
1) Не установлено дополнительное ПО с сайта Фабрикант;
2) Некорректно работает библиотека КриптоПРО Cadescom.

Ваши действия:
1) Установить Специализированное ПО с Портала Фабрикант;
2) Переустановить КриптоПРО Cadescom.
Подробную инструкцию можете скачать здесь

Ошибка №3. Ошибка при открытии хранилища. Объект не поддерживает средство или метод «Open»

Возможные причины:
1) Не установлено дополнительное ПО;
2) Не запущены дополнительные надстройки в браузере.

Ваши действия:
1) Установить Специализированное ПО с Портала Фабрикант;
2) Запустить всплывающие надстройки браузера.
Подробную инструкцию можете скачать здесь

Ошибка №4. «Не удалось проверить статус сертификата.» или «Не валиден. Состояние отозванности сертификата или одного из сертификатов в цепочке сертификатов неизвестно»

Возможная причина:
Не установлены или не обновляются автоматически списки отозванных сертификатов УЦ.

Ваши действия:
Обратитесь в УЦ или самостоятельно установите на своём ПК списки отозванных сертификатов.
Подробную инструкцию можете скачать здесь

Ошибка №5. Ваш сертификат прошёл проверку и может использоваться в любой секции на Торговом портале «Фабрикант», кроме секции Росатом

Возможные причины:
1) Рассинхронизация OCSP-сервер вашего УЦ;
2) Отсутствует ссылка на OCSP-сервер УЦ в сертификате.

Ваши действия:
Обратитесь в Удостоверяющий центр для проверки сертификата или проверьте самостоятельно.
Подробную инструкцию можете скачать здесь

Ошибка №6. «Вставьте ключевой носитель (несоответствие ключевого носителя и выбранного сертификата)».

Возможные причины:
1) Вставлен ключевой носитель, не соответствующий выбранному сертификату;
2) Выбран сертификат, не соответствующий вставленному ключевому носителю.

Ваши действия:
1) Проверить, какой ключевой носитель вставлен;
2) Проверить выбранный сертификат.
Подробную инструкцию можете скачать здесь

Ошибка №7. Ошибка исполнения функции.

Возможная причина:
Истек срок действия лицензии на КриптоПРО CSP.

Ваши действия:
1) Обратитесь в Удостоверяющий центр для получения лицензии на КриптоПРО CSP;
2) Введите лицензию на КриптоПРО CSP.
Подробную инструкцию можете скачать здесь

Ошибка №8. Надпись «undefined»

Возможная причина:
Некорректно отрабатывают настройки браузера Internet Explorer.

Ваши действия:
1) В браузере зайдите в меню «Сервис» и выберите пункт «Свойства обозревателя»;
2) В открывшемся окне перейдите на вкладку «Дополнительно» и нажмите кнопку «Сброс»;
3) Перезапустите браузер Internet Explorer.
Подробную инструкцию можете скачать здесь

Ошибка №9. Ошибка алгоритма.

Возможная причина:
Не соответствуют версии криптопровайдера и Операционной системы.

Ваши действия:
1) Если у вас криптопровайдер VipNet CSP, то необходимо проверить версии на соответствие на сайте ;
2) Если у вас криптопровайдер КриптоПРО CSP, то необходимо проверить версии на соответствие на сайте ;
3) Если версии не соответствуют, то необходимо обратиться в свой Удостоверяющий центр для обновления.

Ошибка №10. Не удается найти указанный файл.

Возможная причина:
После установки дополнительного программного обеспечения с Портала не перезагрузили ПК.

Ваше действие:
Перезагрузите ПК.

С дополнительной информацией можно ознакомиться в инструкции «Установка ПО для ЭП». Также можно обратиться в отдел технической поддержки по тел. +7 (495) 514-02-04.

Ошибка №11. Объект не поддерживает свойство или метод «SetHashValue».

Возможная причина:
1) Не установлено дополнительное ПО;
2) Не запущены дополнительные надстройки в браузере.

Ваше действие:
1) Установить Специализированное ПО с Портала Фабрикант;
2) Запустить всплывающие надстройки браузера.

Подробную инструкцию можете скачать .

Не нашли ответа на вопрос?

  • Напишите нам

В данном обзоре рассмотрим процесс создания веб-инструмента, который позволит нам подписывать различные файлы электронной подписью.

Веб-инструмент — это сайт. Поэтому нам потребуется сервер, с необходимым ПО и какая то система управления им.

Наш сайт будет написан на языке php.

И так, в качестве серверного ПО будем использовать:

  • сервер Linux. С установленным php, apache, nginx. ()
  • SkeekS CMS

На этом не стоит подробно останавливаться, потому что, бэкенда часть нашего сервиса выполняет минимальные действия (формирование и отдача html страниц).

Поэтому по правилам SkeekS CMS мы сформируем html страницу, на которой будет присутствовать html+css+js код.

Сформированная сайтом страница рендерится в браузере клиента. в момент рендеринга, исполняется js и css код присутствующий на ней.

JavaScript обычно используется как встраиваемый язык для программного доступа к объектам приложений. Наиболее широкое применение находит в браузерах как язык сценариев для приданияинтерактивности веб-страницам.

Собственно наша задача и состоит в написании JavaScript кода, который сможет осуществлять действия с электронной подписью.

Данные действия мы сможем осуществлять с использованием плагина для браузера КриптоПро ЭЦП Browser plug-in

КриптоПро ЭЦП Browser plug-in позволяет реализовать работу с ЭЦП (в том числе и с усовершенствованной ЭЦП) в следующих веб-браузерах:

  • Microsoft Internet Explorer,

  • Mozilla Firefox,

  • Opera,

  • Apple Safari,

  • Google Chrome,

  • другие браузеры, поддерживающие плагины NPAPI.

Поддерживаемые операционные системы:

  • Microsoft Windows XP/2003/Vista/2008/W7/2008R2/W8/2012/8.1/2012R2,

  • Linux,

  • Apple iOS,

  • Apple MacOS.

В КриптоПро ЭЦП Browser plug-in реализован набор объектов, идентичный CADESCOM и набор объектов для работы с запросами на сертификат интерфейс CertEnroll.

CAPICOM (англ. Crypto API COM-object) — снятый с поддержки элемент управления ActiveX, созданный Microsoft с целью помочь разработчикам приложений в получении доступа к услугам, которые позволяют обеспечить безопасность для приложений на основе криптографических функций, реализованных в CryptoAPI, через технологию COM. CAPICOM можно использовать для цифровой подписи данных, проверки подписи, отображения информации о цифровой подписи и цифровом сертификате, добавлять или удалять сертификаты и, наконец, для шифрования и расшифровки данных.

http://cpdn.cryptopro.ru/content/cades/cadescom.html — здесь документация по усовершенстованному интерфейсу CADESCOM, на нее и будем опираться.

Ну а теперь код.

1) Для начала код контроллера и действия cms которые готовят HTML и Javascript код который получит клиент в своем браузере.

public function actionSign() { if (\Yii::$app->request->post()) { $rr = new RequestResponse(); $fileName = \Yii::$app->request->post(‘fileName’); $signature = \Yii::$app->request->post(‘signature’); $cert = \Yii::$app->request->post(‘cert’); if ($signature && $fileName && $cert) { $fileName = ProjectComponent::translit($fileName); $dirName = md5(time() . rand(1, 1000)); $rootDir = \Yii::getAlias(‘@frontend/web’); $dir = $rootDir . ‘/tmp/signs/’ . $dirName; $filePath = $dir . «/» . $fileName . «.sgn»; if (FileHelper::createDirectory($dir)) { $file = fopen($filePath, «w+»); fwrite($file, $signature); fclose($file); } $rr->data = \Yii::getAlias(‘@web/tmp/signs/’ . $dirName . «/» . $fileName . «.sgn»); $rr->data = $fileName . «.sgn»; $rr->success = true; $rr->message = »; } else { $rr->success = false; $rr->message = ‘Недостаточно данных’; } return $rr; } return $this->render($this->action->id); }

2) View файл этого действия выглядит так:

<div class=»row»> <div class=»col-md-12″> <?= \frontend\widgets\CryptoProWidget::widget(); ?> <div class=»sx-content-wrapper»> <div style=»display: none; text-align: center;» id=»sx-process-crypto-info-global»> <? \yii\bootstrap\Alert::begin( ]); ?> Исполнение может занять некоторое время. Ожидайте… <? \yii\bootstrap\Alert::end(); ?> </div> <div class=»sx-hidden-success»> <? $model = new \yii\base\DynamicModel(); $form = \yii\bootstrap\ActiveForm::begin( ]); ?> <?= $form->field($model, ‘file’)->label(«Файл для подписи»)->fileInput(); ?> <div style=»display: none;»> <input type=»hidden» name=»sgn» id=»sx-sgn-file»/> <button type=»submit»>Отправить</button> </div> <? \yii\bootstrap\ActiveForm::end(); ?> <div style=»text-align: center»> <div style=»display: none; text-align: center;» id=»sx-process-crypto-info»> <? \yii\bootstrap\Alert::begin( ]); ?> Исполнение может занять некоторое время. Ожидайте… <? \yii\bootstrap\Alert::end(); ?> </div> <button class=»btn btn-lg btn-primary sx-btn-submit» onclick=»sx.FileApiSigner.execute(); return false;»>Подписать</button> </div> </div> <div style=»display: none; text-align: center;» id=»sx-result-wrapper-succss»> <? \yii\bootstrap\Alert::begin( ]); ?> Вы можете скачать или просмотреть подпись, зашифровать файл и подпись <? \yii\bootstrap\Alert::end(); ?> <a href=»#» class=»btn btn-lg btn-primary sx-btn-download» target=»_blank»>Скачать подпись</a> <a href=»#» class=»btn btn-lg btn-primary sx-btn-view» target=»_blank»>Посмотреть подпись</a> <a href=»#» class=»btn btn-lg btn-primary sx-btn-encrypt» target=»_blank»>Зашифровать</a> </div> <div style=»display: none;»> <div> Файл подписи: <div id=»sx-result-file»>Тут будет результат</div> </div> <div> <p id=»info_msg» name=»SignatureTitle»>содержимое:</p> <div id=»item_border»> <textarea id=»SignatureTxtBox» readonly style=»font-size:9pt;height:100px;width:100%;resize:none;border:0;»> </textarea> </div> </div> </div> <div class=»sx-show-success» style=»display: none;»> <hr /> <a href=»#» onclick=»window.location.reload(); return false;» class=»pull-right btn btn-default»> <i class=»glyphicon glyphicon-repeat»></i> Подисать еще один файл </a> </div> </div> </div> </div>

3) Javascript реализующи основные взаимдействия с плагином и осуществляющий необходимые действия подписи файлов.

var DOWNLOAD_URL = «{$url}»; // константа задающая путь к серверному скрипту, через который будет происходить формирование файла для скачивания. var VIEW_URL = «{$viewUrl}»; // константа задающая путь к серверному скрипту, через который будет происходить формирование файла для просмотра. var CADESCOM_CADES_BES = 1; // константой задается формат подписи CAdES-BES (Basic Electronic Signature) в стандарте CAdES var CAPICOM_CURRENT_USER_STORE = 2; var CAPICOM_MY_STORE = «My»; // Хранилище персональных сертификатов пользователя. var CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED = 2; var CADESCOM_BASE64_TO_BINARY = 1; var form = $(‘#sx-sign-form’); //Объект формы Jquery //Функция отправки данных с формы function trySubmit() { try { form.submit(); } catch (err) { setTimeout(function () { trySubmit(); }, 50); } } По клику на кнопку подписать отмеченную классом sx-btn-encrypt, происходит отправка формы $(‘.sx-btn-encrypt’).on(‘click’, function() { $(«#sx-process-crypto-info-global»).show(); $(‘#sx-result-wrapper-succss’).hide(); trySubmit(); return false; }); (function(sx, $, _) { //Класс javascript создаваемый нами для удобства реализации сценария sx.classes.FileApiSigner = sx.classes.Component.extend({ execute: function() { this.trigger(‘beforeSign’); var self = this; // Проверяем, работает ли File API подробнее тут https://developer.mozilla.org/ru/docs/Web/API/FileReader if (window.FileReader) { // Браузер поддерживает File API. } else { this.trigger(‘error’, { ‘error’: ‘The File APIs are not fully supported in this browser.’ }); } //Синтаксис javascript document.getElementById(«dynamicmodel-file») — проверка в форме выбран ли файл для подписи if (0 == document.getElementById(«dynamicmodel-file»).files.length) { this.trigger(‘error’, { ‘error’: «Выберите файл для подписи» }); return; } //Дойдя до этого места, мы проверили, что браузер поддерживает работу с файлами и файл для подписи выбран var oFile = document.getElementById(«dynamicmodel-file»).files; var oFReader = new FileReader(); //Проверка наличия функции в библиотеке работы с файлами ниже подробнее про нужную нам функцию if (typeof(oFReader.readAsDataURL)!=»function») { this.trigger(‘error’, { ‘error’: «Method readAsDataURL() is not supported in FileReader.» }); return; } this.Certificate = sx.CryptoPro.Certificate; if (!this.Certificate) { this.trigger(‘error’, { ‘error’: «Необходимо выбрать сертификат» }); return; } // https://developer.mozilla.org/ru/docs/Web/API/FileReader/readAsDataURL // Запускает процесс чтения данных указанного Blob, по завершении, аттрибут result будет содержать данные файла в виде data: URL. oFReader.readAsDataURL(oFile); // javascript имеет событийную модель, когда процесс чтения завершиться продолжаем исполнять сценарий oFReader.onload = function(oFREvent) { var header = «;base64,»; var sFileData = oFREvent.target.result; //аттрибут result будет содержать данные как URL, представляющий файл, кодированый в base64 строку. var sBase64Data = sFileData.substr(sFileData.indexOf(header) + header.length); //Нужно убрать лишние заголовки, нам нужен только кодированные данные файла без заголовка. // Вызов функции signCreate которая является функцией нашего же класса sx.classes.FileApiSigner для подписи данных var signedMessage = self.signCreate(self.Certificate, sBase64Data); // Выводим отделенную подпись в BASE64 на страницу // Такая подпись должна проверяться в КриптоАРМ и cryptcp.exe document.getElementById(«SignatureTxtBox»).innerHTML = signedMessage; // На всякий случай дополнительная проверка подписи var verifyResult = self.verify(signedMessage, sBase64Data); if (verifyResult) { self.trigger(‘signSuccess’, { ‘signature’ : signedMessage, ‘certObj’ : new CertificateObj(self.Certificate), ‘file’ : oFile, //Файл для подписи }); } }; }, // Реализуем собственную функцию подписи данных, в ней 2 значения, сертификат и данные в формате base64 signCreate: function(oCertificate, dataToSign) { var oStore = cadesplugin.CreateObject(«CAPICOM.Store»); oStore.Open(CAPICOM_CURRENT_USER_STORE, CAPICOM_MY_STORE, CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED); var oSigner = cadesplugin.CreateObject(«CAdESCOM.CPSigner»); oSigner.Certificate = oCertificate; var oSignedData = cadesplugin.CreateObject(«CAdESCOM.CadesSignedData»); oSignedData.ContentEncoding = CADESCOM_BASE64_TO_BINARY; oSignedData.Content = dataToSign; try { var sSignedMessage = oSignedData.SignCades(oSigner, CADESCOM_CADES_BES, true); } catch (err) { alert(«Failed to create signature. Error: » + GetErrorMessage(err)); return; } oStore.Close(); return sSignedMessage; }, verify: function(sSignedMessage, dataToVerify) { var oSignedData = cadesplugin.CreateObject(«CAdESCOM.CadesSignedData»); try { oSignedData.ContentEncoding = CADESCOM_BASE64_TO_BINARY; oSignedData.Content = dataToVerify; oSignedData.VerifyCades(sSignedMessage, CADESCOM_CADES_BES, true); } catch (err) { alert(«Failed to verify signature. Error: » + GetErrorMessage(err)); return false; } return true; } }); sx.CryptoPro.bind(‘updateCertificate’, function() { $(‘.sx-content-wrapper’).show(); sx.FileApiSigner = new sx.classes.FileApiSigner(); sx.FileApiSigner.bind(‘error’, function(e, data) { $(«#sx-process-crypto-info»).hide(); $(«.sx-btn-submit»).empty().append(‘Подписать’).removeAttr(‘disabled’); sx.notify.error(data.error); }); sx.FileApiSigner.bind(‘beforeSign’, function(e, data) { $(«#sx-process-crypto-info»).show(); $(«.sx-btn-submit»).empty().append(‘Подождите’).attr(‘disabled’, ‘disabled’); }); sx.FileApiSigner.bind(‘signSuccess’, function(e, data) { $(«#sx-process-crypto-info»).hide(); $(«#sx-result-file»).empty().append(‘Идет формирование файла…’); $(«.sx-btn-submit»).empty().append(‘Подписать’).removeAttr(‘disabled’); certObj = data.certObj; var ajaxQuery = sx.ajax.preparePostQuery(», { ‘signature’ : data.signature, ‘fileName’ : data.file.name, ‘cert’ : { ‘certName’ : certObj.GetCertName(), ‘issuer’ : certObj.GetIssuer(), ‘certFromDate’ : certObj.GetCertFromDate(), ‘certTillDate’ : certObj.GetCertTillDate(), ‘pubKeyAlgorithm’ : certObj.GetPubKeyAlgorithm(), } }); var ajaxHandler = new sx.classes.AjaxHandlerStandartRespose(ajaxQuery); ajaxHandler.bind(‘success’, function(e, response) { _.delay(function() { $(«#sx-result-file»).empty().append( $(«<a>», { ‘href’ : response.data.src, //’target’ : ‘_blank’, ‘download’ : response.data.name }).text(response.data.name) ); $(«.sx-btn-submit»).remove(); var Container = $(«#sx-result-wrapper-succss»); Container.show(); $(‘.sx-show-success’).show(); $(‘.sx-hidden-success’).hide(); $(«#sx-sgn-file»).val(response.data.src); $(«.sx-btn-download», Container).attr({ ‘href’ : DOWNLOAD_URL + «?fileSrc=» + response.data.src }); $(«.sx-btn-view», Container).attr({ ‘href’ : VIEW_URL + «?fileSrc=» + response.data.src }); /*window.open(DOWNLOAD_URL + «?fileSrc=» + response.data.src);*/ }, 1000); }); ajaxHandler.bind(‘error’, function(e, data) { }); ajaxQuery.execute(); }); }); })(sx, sx.$, sx._);

Из кода выше следует подробно рассмотреть следующие функции, которые и осуществляют подпись и проверку подписи файлов.

var CADESCOM_CADES_BES = 1; var CAPICOM_CURRENT_USER_STORE = 2; var CAPICOM_MY_STORE = «My»; var CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED = 2; var CADESCOM_BASE64_TO_BINARY = 1; signCreate: function(oCertificate, dataToSign) { //Описывает хранилище сертификатов. var oStore = cadesplugin.CreateObject(«CAPICOM.Store»); //Opens a certificate store. oStore.Open(CAPICOM_CURRENT_USER_STORE, CAPICOM_MY_STORE, CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED); //Объект, задающий параметры создания и содержащий информацию об усовершенствованной подписи. var oSigner = cadesplugin.CreateObject(«CAdESCOM.CPSigner»); oSigner.Certificate = oCertificate; //Объект для работы с подписью данных var oSignedData = cadesplugin.CreateObject(«CAdESCOM.CadesSignedData»); oSignedData.ContentEncoding = CADESCOM_BASE64_TO_BINARY; //Кодировка oSignedData.Content = dataToSign; //Данные для подписи try { //Метод SignCades позволяет добавить к сообщению усовершенствованную подпись. //http://cpdn.cryptopro.ru/content/cades/interface_c_ad_e_s_c_o_m_1_1_i_c_p_signed_data2_4e6fce1eab3f028a937b412bdff182dd_14e6fce1eab3f028a937b412bdff182dd.html var sSignedMessage = oSignedData.SignCades(oSigner, CADESCOM_CADES_BES, true); } catch (err) { alert(«Failed to create signature. Error: » + GetErrorMessage(err)); return; } oStore.Close(); return sSignedMessage; }, verify: function(sSignedMessage, dataToVerify) { var oSignedData = cadesplugin.CreateObject(«CAdESCOM.CadesSignedData»); try { oSignedData.ContentEncoding = CADESCOM_BASE64_TO_BINARY; oSignedData.Content = dataToVerify; oSignedData.VerifyCades(sSignedMessage, CADESCOM_CADES_BES, true); } catch (err) { alert(«Failed to verify signature. Error: » + GetErrorMessage(err)); return false; } return true; }

По этому же принципу работают все остальные криптографические функции, поэтому ниже рассмотрим лишь конкретные примеры.

Вычисление хэш значения

var CADESCOM_HASH_ALGORITHM_CP_GOST_3411 = 100; function run() { // Создаем объект CAdESCOM.HashedData var oHashedData = cadesplugin.CreateObject(«CAdESCOM.HashedData»); // Алгоритм хэширования нужно указать до того, как будут переданы данные oHashedData.Algorithm = CADESCOM_HASH_ALGORITHM_CP_GOST_3411; // Передаем данные oHashedData.Hash(«Some data here.»); // Вычисляем хэш-значение var sHashValue1 = oHashedData.Value; // Хэш-значение будет вычислено от данных в кодировке UCS2-LE // Для алгоритма SHA-1 хэш-значение будет совпадать с вычисленным при помощи CAPICOM document.getElementById(«hashVal1»).innerHTML = sHashValue1; // Получение значения свойства oHashedData.Value сбрасывает // состояние объекта (алгоритм хэширования остается прежним). // Но само значение свойства можно получить несколько раз: var sHashValue2 = oHashedData.Value; document.getElementById(«hashVal2»).innerHTML = sHashValue2; // То же самое хэш-значение можно получить, если передать данные по частям oHashedData.Hash(«Some «); oHashedData.Hash(«data «); oHashedData.Hash(«here.»); var sHashValue3 = oHashedData.Value; document.getElementById(«hashVal3»).innerHTML = sHashValue3; }

Вычисление хэш значения бинарных данных (его и используем в проекте)

var CADESCOM_HASH_ALGORITHM_CP_GOST_3411 = 100; var CADESCOM_BASE64_TO_BINARY = 1; function run() { // Создаем объект CAdESCOM.HashedData var oHashedData = cadesplugin.CreateObject(«CAdESCOM.HashedData»); // Алгоритм хэширования нужно указать до того, как будут переданы данные oHashedData.Algorithm = CADESCOM_HASH_ALGORITHM_CP_GOST_3411; // Указываем кодировку данных // Кодировка должна быть указана до того, как будут переданы сами данные oHashedData.DataEncoding = CADESCOM_BASE64_TO_BINARY; // Предварительно закодированные в BASE64 бинарные данные // В данном случае закодирован файл со строкой «Some Data.» var dataInBase64 = «U29tZSBEYXRhLg==»; // Передаем данные oHashedData.Hash(dataInBase64); // Получаем хэш-значение var sHashValue = oHashedData.Value; // Это значение будет совпадать с вычисленным при помощи, например, // утилиты cryptcp от тех же исходных _бинарных_ данных. // В данном случае — от файла со строкой «Some Data.» document.getElementById(«hashVal»).innerHTML = sHashValue; }

Шифроваение данных

/** * Функция шифрования бинарных данных * @param oCertificate выбранный сертификат * @param data бинарные данные закодированные в base64 строку */ encrypt: function(oCertificate, data) { var self = this; //Синтаксис языка javascript проверки ошибок, если не удастся создать объект cadescom.CPEnvelopedData try { // Создаем объект cadescom.CPEnvelopedData var oEnvelop = cadesplugin.CreateObject(«cadescom.CPEnvelopedData»); } catch (err) { alert(‘Failed to create CAdESCOM.CPEnvelopedData: ‘ + err.number); return; } // Указываем кодировку данных // Кодировка должна быть указана до того, как будут переданы сами данные oEnvelop.ContentEncoding = CADESCOM_BASE64_TO_BINARY; // Предварительно закодированные в BASE64 бинарные данные oEnvelop.Content = data; //Установка сертификата для шифрования oEnvelop.Recipients.Add(self.Certificate); //Получаем зашифрованные данные return oEnvelop.Encrypt(); },

Расшифровка данных

/** * Функция расшифровки бинарных данных * @param EncryptedData шифр */ encrypt: function(EncryptedData) { var self = this; //Синтаксис языка javascript проверки ошибок, если не удастся создать объект cadescom.CPEnvelopedData try { // Создаем объект cadescom.CPEnvelopedData var oEnvelop = cadesplugin.CreateObject(«cadescom.CPEnvelopedData»); } catch (err) { alert(‘Failed to create CAdESCOM.CPEnvelopedData: ‘ + err.number); return; } // Указываем кодировку данных // Кодировка должна быть указана до того, как будут переданы сами данные oEnvelop.ContentEncoding = CADESCOM_BASE64_TO_BINARY; // Запуск процесса расшифровки данных oEnvelop.Decrypt(EncryptedData); //В результате расшифровки объект oEnvelop заполнит свойство Content — которое и будет содержать расшифрованные данные var sDecriptedData = oEnvelop.Content; return sDecriptedData; },

FILED UNDER : Статьи

Submit a Comment

Must be required * marked fields.

:*
:*