- Как всем перейти на ЭДО
- Чтение данных ЭЦП из PDF в Joomla 3 и Joomla 4
- Создание плагина для Joomla
- Работа с библиотеками в Joomla
- Различия в указании namespaces в Joomla 3 и Joomla 4
- Готовые библиотеки для чтения ЭЦП в Joomla
- Метод onContentPrepare в Joomla
- Использование Joomla Layout для результирующего HTML
- Начну с того, что всё плохо
- Маразм со счетами-фактурами и УПД со статусом 1
- ЭДО — это просто, как внедрили мы автоматическое подписание документов
- На самом деле всё куда хуже
- Сопротивление и проблемы
- Установка сетевого ответчика (Online responder)
- Процесс настройки
- Безопасность
- Настройка центра сертификации
- Примеры кода
- Хуже уже наверное некуда
- Контекст применения
- КриптоПро — как решить проблему «не найден контейнер, соответствующий открытому ключу сертификата»?
- Минуточку внимания
- .
- Как можно создавать ЭЦП ручками
- Через Оператора ЭДО. (Самый популярный вариант среди коммерческих организаций)
- С помощью плагинов, установленных в Word, Acrobat Reader
- С помощью специальных программ
- С помощью онлайн-сервисов
- Настройка OCSP — сетевого ответчика (Online responder)
- Подготовка документов к подписи с помощью ЭЦП
- Немного об электронной подписи
- Извлечения данных подписи из PDF в PHP
- Установка центра сертификации (Standalone CA Windows Server 2019)
- Настройка веб-сервера IIS
- Готовый плагин для Joomla 3 и Joomla 4
- Полезные ресурсы
- Ресурсы сообщества:
- Telegram:
- Как должно быть
- Результаты
- Объективные плюсы ЭДО
Как всем перейти на ЭДО
Не люблю большевиков, но в 1918 году они просто проехались по типографиям и изъяли лишние буквы. Пора принтеры отбирать у бюрократов. 🙂 Это, конечно, не наши методы. Остаётся пулять в бюрократов файлами с ЭЦП и требовать на основании закона принимать такие документы. Нужно ставить динозавров перед фактом. Нужно проталкивать перемены вокруг себя.
Чтение данных ЭЦП из PDF в Joomla 3 и Joomla 4
В Joomla тексты документов выкладываются материалами. Добавить к материалу pdf-файл для скачивания и отобразить информацию о подписанте из ЭЦП можно несколькими способами:
Обычной ссылкой на файл в тексте материала. В таком случае на потребуется системный или контент-плагин, который будет обрабатывать все ссылки в материале, выделять из них ссылки только на pdf и далее проверять есть ли подпись.
Сделать пользовательское поле для материалов и добавлять файлы только в эти поля. Здесь вариантов работы несколько от кустарных и неправильных, когда обработка ссылки будет идти прямо в шаблоне (не делайте так!) до оформления кода в плагин пользовательского поля. Вот простой мануал по созданию собственного плагина пользовательского поля для Joomla.
Вставить специальный шорт-код. Можно вставить шорт-код, в параметрах которого будет указан путь к файлу для парсинга. В таком случае код плагина упростится, но чуть усложнится работа контент-менеджера.
Именно третий вариант я выбрал для создания плагина.
Создание плагина для Joomla
Материалы перед рендером обрабатывают плагины на событии onContentPrepare, где среди прочих данных мы получаем текст материала для обработки.
<?php
defined('_JEXEC') or die;
/**
*
* @param string $context The context of the content being passed to the plugin.
* @param object &$article The article object. Note $article->text is also available
* @param mixed &$params The article params
* @param integer $page The 'page' number
*
* @return mixed true if there is an error. Void otherwise.
*
* @since 1.6
*/
public function onContentPrepare($context, &$article, &$params, $page = 0)
{
// Don't run this plugin when the content is being indexed
if ($context === 'com_finder.indexer')
{
return true;
}
// Тут наш код.
}
Работа с библиотеками в Joomla
Для работы нашего кода нам требуются 6 библиотек. Пока что Joomla CMS не поддерживает установку пакетов с помощью composer (это в планах к Joomla 5), поэтому нам необходимо подготовить xml-обёртки библиотек для Joomla. Официальная документация по созданию собственных библиотек для Joomla.
Если кратко, нам нужно создать xml-файл, в котором мы расскажем Joomla что это вообще такое:
<?xml version="1.0" encoding="UTF-8" ?>
<extension type="library" version="3.10" method="upgrade">
<name>Webmasterskaya/CryptoBridge Library</name>
<libraryname>Webmasterskaya/CryptoBridge</libraryname>
<version>0.3.1</version>
<description>Russian fork of a SOP\CryptoBridge. A PHP library providing cryptography support for various PKCS applications. Defines an interface with encrypt / decrypt and signature signing / verification methods. Currently only OpenSSL backend is supported.</description>
<creationDate>23/05/2019</creationDate>
<copyright>Joni Eskelinen, Artem Vasilev</copyright>
<license>MIT</license>
<author>Joni Eskelinen, Artem Vasilev, Sergey Tolkachyov</author>
<authorEmail>jonieske@gmail.com, kern.usr@gmail.com</authorEmail>
<authorUrl>https://github.com/webmasterskaya/crypto-types</authorUrl>
<files folder="libraries">
<folder>Crypto</folder>
<file>Crypto.php</file>
</files>
</extension>
– это отображаемое в списке расширений название библиотеки
– это директория библиотеки в /libraries.Если у Вас свой неймспейс и в нём несколько библиотек, то в мы через слеш указываем свой неймспейс.
Так, Webmasterskaya/CryptoBridge означает, что файлы будут лежать в корень_сайта/libraries/Webmasterskaya/CryptoBridge.
Для того, чтобы их использовать нужно зарегистрировать неймспейс этой библиотеки. Официальная документация рекомендует делать это с помощью простого системного плагина на событие onAfterInitialise()
<?php
/**
* @copyright Copyright (C) 2005 - 2013 Open Source Matters, Inc. All rights reserved.
* @license GNU General Public License version 2 or later.
*/
defined('_JEXEC') or die;
use Joomla\CMS\Plugin\CMSPlugin;
/**
* Mylib plugin class.
*
* @package Joomla.plugin
* @subpackage System.mylib
*/
class plgSystemMylib extends CMSPlugin
{
/**
* Method to register custom library.
*
* return void
*/
public function onAfterInitialise()
{
$jversion = new JVersion();
// Проверка какая версия Joomla используется.
if (version_compare($jversion->getShortVersion(), '4.0', '<'))
{
// only for Joomla 3.x
JLoader::registerNamespace('Sop', JPATH_LIBRARIES);
JLoader::registerNamespace('Webmasterskaya', JPATH_LIBRARIES);
JLoader::registerNamespace('Smalot', JPATH_LIBRARIES);
}
else
{
JLoader::registerNamespace('Sop', JPATH_LIBRARIES . '/Sop');
JLoader::registerNamespace('Webmasterskaya', JPATH_LIBRARIES . '/Webmasterskaya');
JLoader::registerNamespace('Smalot', JPATH_LIBRARIES. '/Smalot');
}
}
}
Различия в указании namespaces в Joomla 3 и Joomla 4
В Joomla 3 следует указывать путь, после которого начинается namespace.В Joomla 4 следует указывать путь вплоть до каталога, где начинается namespace.
Готовые библиотеки для чтения ЭЦП в Joomla
Готовые для работы в Joomla библиотеки в xml-обёртках лежат здесь:
Sop/ASN1
SOP/Crypto encoding
Webmasterskaya/Crypto bridge
Webmasterskaya/Crypto types
Webmasterskaya/X501
Webmasterskaya/X509
Также для получения даты последнего изменения PDF-файла я использую библиотеку Smalot/PDFParser.
По идее нужно 2 плагина: один для регистрации неймспейсов библиотек в группе system и один для обработки текста материалов в группе content. Разделение плагинов на группы позволяет не нагружать сервер и задействовать обработку плагинами только тогда, когда это действительно нужно, так как группа системных плагинов вызывается всегда, а плагины групп – каждая в определенном случае. Однако, предполагая, что на сайте школы не будет трафика более 5-10к уников в сутки, да и кэширование можно настроить, поэтому помещаем регистрацию неймспейсов и обработку текста в один плагин.
Метод onContentPrepare в Joomla
Для удобства шорткод сделаем с открывающим и закрывающим тегом. Для кода используем брендированную аббревиатуру, либо что-то интуитивно понятное. Я выбрал {wt_ds_pdf} – “WebTolk Digitally Signed PDF“. В тексте материала $article->text
нам нужно найти регуляркой все вхождения, считать путь между тегами шорткода и обработать его методом для получения данных ЭЦП из PDF.
<?php
defined('_JEXEC') or die('Restricted access');
use Joomla\CMS\Date\Date;
use Joomla\CMS\Language\Text;
use Joomla\CMS\Layout\FileLayout;
use Joomla\CMS\Plugin\CMSPlugin;
use Joomla\CMS\Factory;
use \Sop\ASN1\Element;
use \Sop\ASN1\Type\Constructed\Sequence;
use \Webmasterskaya\X509\Certificate\Certificate;
use \Smalot\PdfParser\Parser;
public function onContentPrepare($context, $article, $params, $limitstart = 0)
{
//Проверка есть ли строка замены в контенте
if (strpos($article->text, 'wt_ds_pdf') === false)
{
return;
}
// Регулярка для поиска в тексте материала
$regex = "~{wt_ds_pdf}.*?{/wt_ds_pdf}~is";
// Получаем все вхождения
if (preg_match_all($regex, $article->text, $matches, PREG_PATTERN_ORDER))
{
// Циклом проводим замену
foreach ($matches[0] as $key => $match)
{
$pdf_file = preg_replace("/{.+?}/", "", $match);
$pdf_file = str_replace(array('"', '\'', '`'), array('"', ''', '`'), $pdf_file); // Address potential XSS attacks
$layoutId = $this->params->get('layout', 'default');
$layout = new FileLayout($layoutId, JPATH_SITE . DIRECTORY_SEPARATOR . 'plugins' . DIRECTORY_SEPARATOR . 'system' . DIRECTORY_SEPARATOR . 'wt_digitally_signed_pdf' . DIRECTORY_SEPARATOR . 'layouts');
// наш метод для получения данных ЭЦП из PDF. Возвращает массив.
$digital_sign_info = $this->getDigitallySignedPdfInfo($pdf_file);
// Путь к файлу для вывода ссылки
$digital_sign_info['link_to_file'] = $pdf_file;
// Получаем HTML с помощью Joomla Layout
$output = $layout->render($digital_sign_info);
$article->text = str_replace($match, $output, $article->text);
}
}//end FOR
} //onContentPrepare END
Для получения даты последнего изменения из мета-данных PDF-файла я подключил библиотеку Smalot/PDF Parser.
<?php
use \Smalot\PdfParser\Parser;
use Joomla\CMS\Date\Date;
$ModDate = new Date($pdf_meta_data['ModDate'], $timezone);
$date_modified = $ModDate->format(Text::_('DATE_FORMAT_LC6'),true);
Использование Joomla Layout для результирующего HTML
Joomla построена по паттерну MVC, в который добавлен Layout. Layout позволяет создавать переопределения макетов, что является одной из важнейших и удобнейших особенностей Joomla. В плагине Вы создаете папку layouts, в которой лежат html-макеты вывода. В нём доступен массив данных $displayData (мы передаём его в методе $output = $layout->render($digital_sign_info); чуть ниже по коду). В настройках плагина Joomla я добавил выбор макета вывода (layout’а) информации о файле и электронной подписи. Соответственно Вы можете сверстать себе вывод просто ссылки со всплывающим тултипом, а можете использовать HTML5 тег для того, чтобы удобно было просматривать информацию как на десктопах, так и на мобильных устройствах или любой другой вариант вывода. При желании плагин можно усовершенствовать и указывать в шорткоде дополнительный параметр, например, “tmpl=link” или “tmpl=html5_details”.
<?php
// Файл layout'a
use Joomla\CMS\Language\Text;
use \Joomla\CMS\Date\Date;
defined('_JEXEC') or die('Restricted access');
/**
* @var $displayData array Digital sign data
* Use
* echo '<pre>';
* print_r($displayData);
* echo '</pre>';
*
* Информация в массиве с данными подписи может быть очень разная в зависимости от типа подписи, производителя.
* Поэтому смотрим массив $displayData и отображаем только нужную информацию.
* Array
* (
* [pdf_date_modified] => дата последнего изменения pdf-файла. Как правило, это дата подписания.
* [inn] => ИНН
* [snils] => СНИЛС
* [email] => электронная почта
* [country] => RU - двухсимвольный код страны
* [province] => регион/область
* [city] => город
* [organisation] => название организации
* [given_name] => имя и отчество должностного лица
* [surname] => фамилия должностного лица
* [common_name] => Ф.И.О. целиком
* [post] => должность
* [cert_date_start] => дата начала действия сертификата электронной подписи
* [cert_date_end] => дата окончания действия сертификата электронной подписи
* [serial_number] => серийный номер
* [link_to_file] => ссылка на файл
* [sign_icon] => иконка ЭЦП из настроек плагина
* )
*
*/
$cert_date_start = new Date($displayData['cert_date_start']);
$cert_date_end = new Date($displayData['cert_date_end']);
$tooltip = 'Здесь отображаем нужную нам информацию. Хотя варианты вывода ограничны лишь Вашей фантазией.';
$tooltip .= '<br/><strong>Период действия сертификата</strong> '. $cert_date_start->format(Text::_('DATE_FORMAT_FILTER_DATE')).'-'.$cert_date_end->format(Text::_('DATE_FORMAT_FILTER_DATE'));
echo '<a data-hren="'.$displayData['link_to_file'].'" class="hasTooltip" data-toggle="tooltip" data-html="true" title="'.$tooltip.'"><img src="'.$displayData['sign_icon'].'" alt="Документ подписан цифровой подписью"/>Скачать файл</a>';
Предложенный вариант layout’a является просто примером вывода. При использовании Joomla layouts становится возможным использовать переопределения макета и Joomla будет искать переопределения в шаблоне фронтенда и использовать их, если они обнаружены. При необходимости можно добавить свои пути, которые должны использоваться при поиске переопределений.
<?php
// Пример добавления путей в Joomla Layout из файлового менеджера Quantum manager
protected function getLayoutPaths()
{
$renderer = new FileLayout('default');
$renderer->getDefaultIncludePaths();
return array_merge(parent::getLayoutPaths(), [
JPATH_ROOT . '/administrator/components/com_quantummanager/layouts/fields'
], $renderer->getDefaultIncludePaths());
}
Начну с того, что всё плохо
В конце прошлого года была наконец введена в эксплуатацию государственная информационная система ведения Единой электронной картографической основы (ЕЭКО) – нормальные современные актуальные карты.
Также Публичная кадастровая карта (ПКК) получила государственную электронную картографическую подложку – с тех пор их сайт редко работает.
Параллельно появился еще вот этот неясный сервис типа магазина открытых данных, его подложку можно спутать с ЕЭКО, однако это не она, здесь карты не обновлены и (умышленно) куда менее детальны.
Однако, для получения информации в векторном виде оператор ЕЭКО – “Центр геодезии, картографии и инфраструктуры пространственных данных”, ссылаясь на законодательство, требует использовать дорогостоящие средства криптозащиты “КриптоПро” – вот полюбуйтесь:
В рамках реализации требований по защите информации в соответствии с Федеральными законами № 149-ФЗ от 27.07.2010 г. «Об информации, информационных технологиях и о защите информации», № 152-ФЗ от 27.07.2006 г. «О персональных данных» и приказа ФСТЭК России от 11 февраля 2013 г. № 17 «Об утверждении Требований о защите информации, не составляющей государственную тайну, содержащейся в государственных информационных системах», для защиты передачи конфиденциальной информации, в том числе персональных данных, необходимо для подключения к ресурсам ГИС ФППД и ГИС ЕЭКО необходимо использовать защищенное подключение.
Но в приведенных законах нет такой строчки, а в приказе ФСТЭК написано прямо противоположное:
В документе не рассматриваются требования о защите информации, связанные с применением криптографических методов защиты информации и шифровальных (криптографических) средств защиты информации.
ЕЭКО создаётся и предоставляется на основе следующего закона. И кто мешает использовать общедоступную криптографию? Для меня здесь очевиден преступный сговор “Центра геодезии, картографии и ИПД” с “КриптоПро”.
Маразм со счетами-фактурами и УПД со статусом 1
Счета-фактуры стоит отметить отдельно. В соответствии со ст. 169 НК РФ счета-фактуры в электронном формате могут формироваться, только если обе стороны согласны с этим. В то же время потихоньку обязывают всех быть согласными. Так, декларация по НДС уже для всех в электронном виде. Для отслеживаемых товаров для всех обязательно использовать счета-фактуры в электронном виде, ну и скоро это будет для всех, как плавно всех обязали сдавать отчётность по НДС в электронном виде.
В соответствии с Приказом Минфина от 10.11.2015 г. № 174н, счета-фактуры нужно оформлять по формату, регламентированному ФНС, и передавать только через оператора. Вот это требование оператора бредовое отчасти. Понятно, что оператор удостоверяет факт отправки и проверяет валидность XML, но зачем это делать обязательным для всех?! Лучше бы обязали те же банки принимать у граждан документы в электронном виде, и не выносить мозги.
У счета-фактуры строго регламентированный формат, как в XML, так и в бумажном виде. XML-формат регламентирован Приказом ФНС России от 19.12.2018 N ММВ-7-15/820@
Печатная (бумажная) форма регламентирована Постановлением Правительства РФ от 26.12.2011 г. № 1137.
На данный момент операторы ЭДО своевременно обновляют как XML, так и печатные формы счетов-фактур в соответствии с выходящими поправками в законах. Так что в этом смысле, можно не беспокоиться относительно правильности использования той или иной формы. Если ваш формат будет устаревшим, оператор об этом предупредит и предложит функционал для оформления документа в новом.
Составлять книгу покупок и книгу продаж можно как в электронном, так и в бумажном виде. (п. 1 Правил ведения книги покупок и п. 1 Правил ведения книги продаж, утв. постановлением № 1137)
Хранить счета-фактуры, подписанные ЭЦП, в электронном виде рекомендуем вместе с протоколами отправки и получения (технологическими документами). Дабы иметь на руках документы, в случае, если доступ к ЛК оператора будет невозможен. (Технические работы, отсутствие подключения к интернету и .т.п.)
Для автоматизации нужен открытый и бесплатный API, но Контур.Диадок API нам не дал.
ЭДО — это просто, как внедрили мы автоматическое подписание документов
Основная нагрузка у нас на закрывающие документы. В дополнение к ним: акты сверки, доверенности, счета на оплату. Договор у нас является офертой, поэтому с ним проще.
Распечатать документы, подписать, упаковать в конверты, отправить — в реальности дурацкая и никому ненужная работа. Переводится масса бумаги, гробятся миллионы человекочасов в масштабах страны. Нулевая добавочная стоимость. Потом вся эта макулатура выкидывается на помойку, даже во вторсырьё не попадает. Поэтому начали мы именно с закрывашек.
Для работы с ЭДО необходимо иметь действующий сертификат квалифицированной электронной подписи (КЭП). Его можно получить с 1 июля 2021 года в налоговой бесплатно, а ранее за деньги в удостоверяющем центре. Вопрос получения КЭП сводится к звонку или заполнению онлайн заявки, оплате счета (обычно не более 5тыс за одну подпись) и разовому посещению филиала УЦ. При этом, у некоторых УЦ есть услуга выезда тех. специалиста на дом для сверки вашей личности. То есть вам даже из дома выходить не надо.
Далее устанавливаем КриптоПро CSP https://cryptopro.ru/products/csp/downloads Скачиваем linux-amd64_deb.tgz
tar -xvf linux-amd64_deb.tgz && cd linux-amd64_deb
sudo ./install.sh
Добавляем файл сертификата ЭЦП
/opt/cprocsp/bin/amd64/certmgr -install -pfx -file ecp.pfx -pin 6493
При отправке документов по почте вместе с файлом отправляется и отсоединённая ЭЦП. Генерится ЭЦП просто:
/opt/cprocsp/bin/amd64/cryptcp -sign -dn "INN=007730588444" file_path sig_path
-pin "crypto_pro_container_pwd"
Крипто Про на редкость рукожопный софт. Попытка собрать модуль под PHP — это адский квест. Одной командой просто поставить модуль нельзя. Но и с консоли работает, и этого достаточно.
Для всех документов, кроме счетов-фактур, можно использовать такой способ подписания. Но и счёт-фактуру в pdf не лишним будет подписать.
На самом деле всё куда хуже
Публичная кадастровая карта, точнее её бэкенд, работает на каком то по мировым меркам ноунеймовом сервере “GIS WebService SE” (на Эльбрусах ещё поди запущен) от КБ Панорама – разработчики всей отечественной картографии, на софте которых и делается ЕЭКО.
Сервер этот (ну насколько я помню, ПКК то лежит опять) генерирует растровые тайлы самой кадастровой карты, ЕЭКО и других слоёв. И все юзеры просто берут ссылки на эти растровые тайлы и подгружают их в свои ГИС, чтобы работать над своими проектами. Либо массово качают их на свои сервера – по традиции – поэтому мощности инфраструктуры не хватает и часто ПКК не работает.
И это вместо того чтобы сделать нормальные открытые всем общепринятые векторные тайлы через нормальные API. Кстати, API у них есть, но отродясь не работало, точнее они вроде дают доступ только государственным сервисам, по IP наверное.
Кстати о тайлах – экскурс в историю – 10 лет назад предыдущая версия обновленных карт Генштаба (до того работали с их сканами) опять же в виде растровых тайлов была выложена на сайте maps.ggc.ru – оттуда она была быстро удалена, но до того успешно скачана энтузиастами и выложена на торрент-трекеры и личные сервера энтузиастов – так и жили.
Это чтобы не связываться с государственными бюрократами – они для заказа векторных листов (!) карт использовали сервис, генерировавший PDF заявления, которые нужно было слать им на мейл – и это происходило до недавнего времени! А как сейчас не знаю, я не хочу покупать “КриптоПро”.
Сопротивление и проблемы
Уже несколько лет, как задумал внедрить у нас электронный документооборот (ЭДО). Конечно, мы давно подключились к Контур.Диадок. Но там и сейчас далеко не все. А в то же время есть п. 1 ст. 6 63-ФЗ, который говорит, что:
“Информация в электронной форме, подписанная квалифицированной электронной подписью, признается электронным документом, равнозначным документу на бумажном носителе, подписанному собственноручной подписью, и может применяться в любых правоотношениях в соответствии с законодательством Российской Федерации, кроме случая, если федеральными законами или принимаемыми в соответствии с ними нормативными правовыми актами установлено требование о необходимости составления документа исключительно на бумажном носителе.”
Давно пора всё подписывать усиленной квалифицированной электронной подписью (УКЭП). Проверить подпись элементарно!
На сайте Государственных услуг, выбираем раздел «— электронного документа. ЭП — отсоединенная, в формате PKCS#7».
Загружаем файл документа и файл подписи.
Нажимаем «Проверить» и смотрим результат.
Даже системы ЭДО типа Контур.Диадок по сути и не нужны. Мы сделали для клиентов специальный раздел ЭДО на сайте. В договор, ЛК, рассылки счетов и закрывающих документов мы добавили информацию про ЭДО. Это не помогало. Люди, а особенно бухгалтеры, консервативны. От нас всё равно требовали бумагу. Тогда мы пошли на хитрость. Мы разослали такое письмо, мол вы не против?! А народ пассивен, и вообще в массе забыл, как это — быть против.
С 1 июля для отслеживаемых товаров обязательно использовать электронные счета-фактуры. 43% наших контрагентов уже перешли на ЭДО, а в ближайшее время вынуждены будут перейти и остальные. Вместо отправки бумажных документов мы планируем рассылать по электронной почте и предоставлять для скачивания в ЛК все документы с УКЭП. Согласно п.1 ст. 6 63-ФЗ такие документы приравнены к собственноручной подписи.
Также можно обмениваться документами в ЭДО Контур.Диадок и других операторов.
Если вы против перехода на электронный документооборот и заботы о природе, пожалуйста, напишите нам о причинах ответным письмом.
Давайте идти в ногу со временем вместе!
Веб-студия и дата-центр ITSOFT
И почти никто не сказал, что он против.
Самый большой проблемой был страх сотрудников перед клиентами. Неспособность реально оценить масштаб проблемы. Боязнь перемен. Собственные сотрудники постоянно боятся что-то менять, на основе требований одного клиента почему-то делают обобщение в отношении всех клиентов. Перемены — это боль и для них, и для клиентов, ведь был уже отлаженный процесс, а тут нужно по-другому. Один клиент требует счёт с подписью генерального. Хоть бы подумал, в состоянии ли генеральный тысячи счетов подписать. Другой сотрудник говорит: “Нельзя клиенту предложить документы в ЛК с откреплённой подписью, так как с ним ЭДО через оператора”. Утверждение ни на чём не основано и прямо противоречит 63-ФЗ, но вокруг просто море чеховских человеков в футляре: нельзя, как бы чего не вышло.
Это сопротивление приходилось прорубать, как Петру I окно в Европу.
С появлением 63-ФЗ давно уже можно было перейти на ЭДО. Однако до сих пор офисный планктон впадает в ступор когда присылаешь файл с ЭЦП. Особенно банковские работники. Получив файл с подписью, ссылкой на закон и методом проверки на Госуслугах, система у них зависает. Отказать они не могут, но и что делать не знают. Для них это как в первый раз увидели оплату телефоном. Шок!
Мы 1.5 года уже судимся с ВТБ. ВТБ решил, что может не признать моё письмо подписанное ЭЦП о закрытии счёта. Уже прошли первую инстанцию, апелляцию, развернули дело в кассации, опять проиграли в первой инстанции, в апелляции, сейчас кассацию снова ждём. Но мы до Верховного Суда дойдём и поставим точку в этом вопросе. Либо суду придётся признать, что 63-ФЗ и пункт 1 статьи 859 ГК РФ не действуют в РФ либо мы победим. Мы ступили в прошлой кассации, надо было там просить не возвращать дело на пересмотр, а выносить решение. Первая кассация возвращая дело фактически подтвердила здравый смысл и нашу правоту, но суд решил продолжать юлить. И дело пересматривала та же судья, что в первый раз. Мне казалось, после кассации она должна была исправиться.
Установка сетевого ответчика (Online responder)
А вот мы и вернулись к установке автоответчика.
1. Добавляем роль в «Диспетчере серверов» (Server Manager) – «Далее (Next)»
1.1. Установка ролей и компонентов (Add roles and features wizard)» – «Далее (Next)»;
1.2. «Роли сервера (Server roles), раскрываем роль: Служба сертификатов Active Directory (Certificate Services Active Directory); и устанавливаем галочку на «Сетевой ответчик» (Online Responder)
1.3. Завершаем работу с мастером ролей и компонентов, путём односмысленных нажатий «Далее (Next)».
В IIS была добавлена Applications: ocsp. Только не пугайтесь, что сама по себе директория пустая. Так и должно быть.
Нам осталось настроить центр сертификации и выпустить сертификат на OCSP.
Процесс настройки
Ранее я не сталкивался с центрами сертификациями. Поскольку ОС Windows Server мне ближе, решил развернуть ЦС с использованием Server Manager. Разворачивать контроллер домена не нужно, так как сертификаты будут выдаваться внешним пользователям. Соответственно, можно обойтись «автономным» центром сертификации, подробнее о нём расскажу позже.
Перед развертыванием центра сертификации необходимо:
Установить СКЗИ КриптоПро CSP 5.0.12330:
Установить КриптоПро ЭЦП Browser plug-in;
Инсталляцию производим через «Дополнительные опции»
Выбираем язык установки, уровень защиты КС1 (другие уровни защиты требуют дополнительных аппаратных средств защиты);
В разделе «Установка компонентов» проверяем, что добавлен «Криптопровайдер уровня ядра ОС»; (рис. 1)
Рисунок 1. Установка дополнительных компонентов «КриптоПро CSP»
Криптопровайдер уровня ядра ОС необходим для работы криптопровайдера в службах и ядре Windows.
3. В следующем окне оставляем пункты:
Зарегистрировать считыватель «Реестр» (позволит сохранять контейнеры ключей в реестр);
Усиленный контроль использования ключей;
Не разрешать интерактивные сервисы Windows;
4. Также «КриптоПро» предложит добавить сертификаты своих центров сертификации;
5. Устанавливаем, перезагружаемся.
Безопасность
Противники ЭДО, они же сторонники бумажных документов, часто начинают говорить про безопасность, что деньги воруют с банковских карт, с помощью ЭЦП уже и недвижимость переоформляли. Можно подумать с бумажками такого никогда не было. Технология — это лишь способ взаимодействия. Технологии меняются, жулики остаются. Правда, жуликам приходится повышать квалификацию. С повышением квалификации проще зарабатывать деньги честным путём. А некоторые технологии ликвидируют виды преступлений или существенно снижают их количество.
Настройка центра сертификации
1. В «Диспетчере серверов (Server manager)» – выбираем «Служба сертификации Active Directory (AD CS) – правой клавишей по вашему серверу и открываем: «Центр сертификации (Certification Authority).
1.1. Вы попали в оснастку управления центром сертификации: certsrv.
1.2. Выбираем ваш центр сертификации и открываем свойства (рис. 10):
Рисунок 10. Настройка центра сертификации. Оснастка управления центром сертификации certsrv.
1.3. Следующим важным шагом выступает настройка точек распространения CDP и AIA.
Authority Information Access (AIA) — содержит ссылки на корневой сертификат центра сертификации (Certification Authority)
CRL Distribution Point — содержит ссылки на файлы CRL, которые периодически публикует сервер CA, который издал рассматриваемый сертификат. Этот файл содержит серийные номера и прочую информацию о сертификатах, которые были отозваны. (рис. 11)
Мы используем веб-сервер, который доступен как внутри сети, так и из интернета (так как сертификаты могут использоваться пользователями интернета) по одному и тому же URL.
1.4. В разделе свойства переходим в «Расширения (Extensions):
Удаляем ненужные точки распространения и оставляем локальную и внешнюю ссылку для CDP:
http://<ip_address/dns_name>/CertSrv/CertEnroll/<CaName><CRLNAmeSuffix><DeltaCRLAllowed>.crl
Ставим галочки «Включить в CRL. Включить в CDP (Include in CRL. Include in the CDP)».
AIA:
http://<ip_address/dns_name>/CertSrv/CertEnroll/<ServerDNSName>_<CaName><CertificateName>.crt
Ставим галочку: «Включать в AIA- расширение выданных сертификатов (Include in the AIA extension of issued certificates)»
OCSP:
https://<ip_address/dns_name>/ocsp
Ставим галочку: «Включать в расширение протокола OCSP (Include in the online certificate status protocol (OCSP) extension)»
Рисунок 11. Настройка точек распространения AIA и CRL
В свойствах центра сертификации можно настроить автоматический выпуск сертификатов при поступившем запросе. Так вы исключаете возможность проверки указанных требуемых полей сертификатов. Для этого перейдите в «Модуль политик (Policy Module)» — «Свойства (Properties)» и выберите соответствующий пункт:
В первом случае сертификату присваивается режим ожидания, а одобрение выпуска сертификата остается за администратором;
Во втором случае из-за отсутствия шаблонов в Standalone CA сертификаты будут выпускаться автоматически. (рис. 12)
Рисунок 12. Дополнительные настройки ЦС для автоматического выпуска сертификатов
Да, центр сертификации уже функционирует и доступен по указанному dns-имени. Не забудьте открыть 80 и 443 порты для функционирования веб-сервера и online-reposnder’a, настройкой которого мы займёмся далее.
Проверить работу ЦС вы можете, перейдя в ChromiumGost или Internet Explorer или Edge (с поддержкой Internet Explorer(IE)): https://localhost/CertSrv.
При переходе по ссылке извне в IE необходимо добавить наш веб-сервер в «Надежные сайты (Trusted Sites)» в настройках в пункте «Безопасность». Не забудьте, что должен быть установлен КриптоПро CSP, в ином случае при выпуске сертификата вам не будет доступен выбор ГОСТовского криптопровайдера (рис.13).
Рисунок 13. Веб-интерфейс центра сертификации. Формирование запроса. Правильное отображение
Также вы можете здесь вручную скачать сертификат нашего ЦС, цепочку сертификатов, CRL и разностные CRL. Кстати говоря, их мы и забыли настроить.
Вернёмся в оснастку certsrv к нашему центру сертификации и настроим выпуск разностных CRL. Для этого необходимо открыть «Свойства (Properties)» раздела «отозванных сертификатов (Revoked Certificates)» (рис. 14).
1. Задаём «Интервал публикации CRL (CRL Publications interval)».
1.1. Включаем публикацию разностных CRL и задаём интервал.
Кажется, что все хорошо. Но есть один момент:
«ЦС будет публиковать Delta CRL, которые содержат символ плюс «+» в имени файла (например, contoso-pica+.crl). По умолчанию IIS будет расценивать этот символ в запросе как метасимвол и не позволит клиентам скачать список отзыва. Необходимо включить двойной эскейпинг в настройках IIS, чтобы расценивать знак плюса в запросе как литерал:»
Выполните следующую команду в power shell:
Import-Module -Name WebAdministration
Set-WebConfigurationProperty -PSPath 'MACHINE/WEBROOT/APPHOST' -Filter /system.webServer/security/requestFiltering -name allowdoubleescaping -Value 'true'
Рисунок 14. Настройка параметров публикации CRL.
Примеры кода
Извлечь pkcs7 из pdf на php можно регулярным выражением, так как подпись в файле выглядит как длинная кодированная строка между двух угловых скобок <>, находящаяся в массиве ByteRange.
Скриншот кода PDF-файла с массивом ByteRange
<?php
$file_name = 'test_pdf_signed.pdf';
$content = file_get_contents(JPATH_SITE . '/' . $file_name);
$regexp = '#ByteRange\[\s*(\d+) (\d+) (\d+)#'; // subexpressions are used to extract b and c
$result = [];
preg_match_all($regexp, $content, $result);
Далее извлекается собственно подпись в бинарном виде.
<?php
$file_name = 'test_pdf_signed.pdf';
$content = file_get_contents(JPATH_SITE . '/' . $file_name);
$regexp = '#ByteRange\[\s*(\d+) (\d+) (\d+)#'; // регулярка для поиска подписи
$result = [];
preg_match_all($regexp, $content, $result);
if (isset($result[2]) && isset($result[3]) && isset($result[2][0])
&& isset($result[3][0])
)
{
$start = $result[2][0];
$end = $result[3][0];
if ($stream = fopen(JPATH_SITE . '/' . $file_name, 'rb'))
{
$signature = stream_get_contents(
$stream, $end - $start - 2, $start + 1
); // Мы должны обрезать угловые скобки с начала и конца
fclose($stream);
}
}
Далее мы конвертируем шестнадцатеричные данные в двоичные и скармливаем их библиотеке для работы с алгоритмами.
Весь скрипт чтения данных электронной подписи из pdf на php без привязки к конкретному движку чуть ниже.
Для работы необходимы 6 библиотек:
SOP/Crypto encoding (Packagist)
Webmasterskaya/Crypto bridge (Packagist)
Webmasterskaya/Crypto types (Packagist)
Также можно установить их с помощью composer:
{
"require": {
"sop/asn1": "^4.1",
"webmasterskaya/x509": "dev-master"
},
"minimum-stability": "dev"
}
Для корректной работы библиотек проверьте, что в PHP включены следующие расширения:
intl
gmp
mbstring
openssl
Код скрипта:
<?php
use Sop\ASN1\Element;
use Sop\ASN1\Type\Constructed\Sequence;
use Webmasterskaya\X509\Certificate\Certificate;
require_once __DIR__ . './vendor/autoload.php';
$file_name = 'test_pdf_signed.pdf';
$content = file_get_contents($file_name);
$regexp = '#ByteRange\[\s*(\d+) (\d+) (\d+)#'; // subexpressions are used to extract b and c
$result = [];
preg_match_all($regexp, $content, $result);
if (isset($result[2]) && isset($result[3]) && isset($result[2][0])
&& isset($result[3][0])
) {
$start = $result[2][0];
$end = $result[3][0];
if ($stream = fopen($file_name, 'rb')) {
$signature = stream_get_contents(
$stream, $end - $start - 2, $start + 1
); // because we need to exclude < and > from start and end
fclose($stream);
}
if (!empty($signature)) {
$binary = hex2bin($signature);
$seq = Sequence::fromDER($binary);
$signed_data = $seq->getTagged(0)->asExplicit()->asSequence();
$ecac = $signed_data->getTagged(0)->asImplicit(Element::TYPE_SET)
->asSet();
/** @var Sop\ASN1\Type\UnspecifiedType $ecoc */
$ecoc = $ecac->at($ecac->count() - 1);
$cert = Certificate::fromASN1($ecoc->asSequence());
foreach ($cert->tbsCertificate()->subject()->all() as $attr) {
/** @var Webmasterskaya\X501\ASN1\AttributeTypeAndValue $atv */
$atv = $attr->getIterator()->current();
echo $atv->type()->typeName() . ' : ' . $atv->value()->stringValue() . PHP_EOL;
}
}
}
В российских электронных подписях встречаются поля, которых нет в западных электронных подписях. Например, поля 1.2.643.3.131.1.1 = ИНН и 1.2.643.100.1 = ОГРН. Эти отличающиеся поля описаны в Приказе ФСБ России от 27.12.2011 N 795 (ред. от 29.01.2021) “Об утверждении Требований к форме квалифицированного сертификата ключа проверки электронной подписи” (Зарегистрировано в Минюсте России 27.01.2012 N 23041).
Хуже уже наверное некуда
Кроме того, в конце прошлого года Правительство РФ утвердило государственную программу «Национальная система пространственных данных». Премьером подписано, губернаторы там выступают, вице-премьер аж припёрся.
Подрядчиком по проекту выбрана “PARMA Technologies Group” – новость. Эти же ребята делали картографические сервисы-мешапы по поиску дальневосточных и арктических гектаров – надальнийвосток.рф – а эта хрень вообще никогда нормально не работала. Сами они, видимо, не особо понимают как система должна выглядеть и работать, поэтому сейчас нанимают армию бизнес-аналитиков.
Они, кстати, говорят, выходцы из одной местной мутной конторы PROGNOZ, и на них уже наезжает прокуратура – новость – большие СМИ почему-то вообще молчат об этой истории, хотя деньги вроде вертятся вполне приличные.
Контекст применения
Не секрет, что на Joomla CMS сделано очень много сайтов для образовательных учреждений – как начального звена, так и ССУЗов и ВУЗов. На сайты образовательных учреждений распространяется (на момент написания статьи) Приказ Рособрнадзора от 14.08.2020 №831 (ред. от 07.05.2021) “Об утверждении Требований к структуре официального сайта образовательной организации в информационно-телекоммуникационной сети “Интернет” и формату представления информации” (Зарегистрировано в Минюсте России 12.11.2020 N 60867). Также непосредственное влияние оказывает статья 29 Федерального закона от 29 декабря 2021 г. №273-ФЗ “Об образовании в Российской Федерации” и статья 6 Федерального закона от 6 апреля 2011г. №63-ФЗ “Об электронной подписи”.
Согласно этим документам образовательное учреждение должно выкладывать на своём сайте документы как в текстовом виде, так и в виде файлов, подписанных “простой электронной подписью” (п.п. 3.2 и 6.г Приказа Рособрнадзора). Ситуация по учебным учреждениям страны очень и очень разная. Например, ВУЗ может позволить себе IT-отдел или как минимум системного администратора. А на уровне ССУЗов и школ может не оказаться IT-специалиста, который занимался бы только IT. Но, требования закона одинаковы и для столичного ВУЗа и для условной музыкальной школы небольшого уездного городка.
КриптоПро — как решить проблему «не найден контейнер, соответствующий открытому ключу сертификата»?
Мне прислали через интернет файл открытого сертификата. Пытаюсь его установить через КриптоПро CSP – Установить личный сертификат. Мастер установки выдаёт ошибку:
не найден контейнер, соответствующий открытому ключу сертификата
Браузер тоже сертификат не видит. Что делать?
- Вопрос задан
19 апр.
Пригласить эксперта
Очевидно, установить носитель (флешку) с нужным контейнером
15 сент. 2022, в 13:52
35000 руб./за проект
15 сент. 2022, в 13:41
10000 руб./за проект
15 сент. 2022, в 13:35
2000 руб./за проект
Минуточку внимания
.
Надеюсь, не сильно наврал, я ведь просто энтузиаст, хз чего молчат картографы и прочие инженеры. Будет прекрасно, если кто-нибудь раздует это в СМИ.
Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
Ну что, распирает гордость за державу?
Проголосовали 60 пользователей.
Воздержались 33 пользователя.
Как можно создавать ЭЦП ручками
Через Оператора ЭДО. (Самый популярный вариант среди коммерческих организаций)
Позволяют подписать документ внутри системы и направить контрагенту через эту же систему. На документе при печати есть оттиск “Подписано ЭЦП”. Нужно купить подписку у оператора ЭДО. Например, Контур.диадок. Подходит ли обмена формализованными документами, формат которых регламентирован: счет-фактуры, накладные, акты, УПД и т.п.
Минусы — платно, сложность обмена документами между разными операторами.
Плюсы — проверка документов на соответствие текущим обязательным форматам. Возможность интеграции с 1С, по API
Есть проверка действия КЭП. Статус-бар сразу видно в интерфейсе. Уведомление при недействительной КЭП.
Внимание! Оператор не имеет информации о полномочиях подписанта. Эту информацию нужно запрашивать у контрагента. Доверенность лучше хранить у себя.
С помощью плагинов, установленных в Word, Acrobat Reader
Позволяет подписать документ сразу в редакторе. После подписания документ недоступен для редактирования. Тут же возможно быстрая проверка действительности КЭП. Вшита в сам документ.
Нужно установить дополнение/плагин к программе (редактору). Подходит для:
подписания (визирования) документов внутри компании;
оперативной отправки документов контрагентам;
подписания документов, отправляемых в гос. органы.
Минусы: платно и не универсально.
Плюсы: если вы работаете преимущественно в одном редакторе — просто и быстро в использовании. Есть проверка действия КЭП. Кнопка проверки на статус-баре.
С помощью специальных программ
Позволяет выбрать документ и подписать его КЭП на компьютере оффлайн. Подпись формируется отдельным файлом. При изменениях в самом файле, к которому относится КЭП, сама ЭЦП становится недействительна. Нужно установить отдельную программу. Например, КриптоАРМ.
Подходит для всех случаев из предыдущего раздела.
Минусы: платно. Достаточно сложно в использовании. Малопопулярно, часто требуется дополнительно давать инструкцию контрагентам о том, как с этим работать.
Плюсы: Нет привязки к онлайн-сервисам. Не нужна регистрация/авторизация.
Наша инструкция: https://www.dropbox.com/sh/7h12dkdemcy65ep/AAArAS_dTL-bh2nXzfQD1RMja?dl=0
Нет проверки действия КЭП. Требуется проверка через КриптоПро..
С помощью онлайн-сервисов
Позволяет выбрать документ через интерфейс и подписать его КЭП. Подпись формируется отдельным файлом. При изменениях в самом файле, к которому относится КЭП, сама КЭП становится недействительна. Например, Контур.крипто
Подходит для всех случаев из предыдущего раздела.
Минусы: малопопулярно, часто требуется дополнительно давать инструкцию контрагентам о том, как с этим работать.
Плюсы: просто в использовании. Бесплатно.
Проверка действия ЭЦП: Нет. Требуется проверка через КриптоПро.
Настройка OCSP — сетевого ответчика (Online responder)
Так как у Standalone центра сертификации нет шаблонов, нам необходимо вручную сформировать запрос и выпуск сертификата для конфигурации отзыва (Array configuration) в «Управление сетевым ответчиком (Online responder management). Для это используйте следующую конфигурацию для формирования запроса
1.1. Создайте: ocsp.txt cо следующим внутренним содержанием:
[NewRequest]
Subject = "CN=Имя"
PrivateKeyArchive = FALSE
Exportable = TRUE
UserProtected = FALSE
MachineKeySet = TRUE
ProviderName = "Crypto-Pro GOST R 34.10-2012 Cryptographic Service Provider"
KeyLength = 512
UseExistingKeySet = FALSE
RequestType = PKCS10
[ApplicationPolicyStatementExtension]
Policies = OCSPSigning
Critical = false
[OCSPSigning]
OID = 1.3.6.1.5.5.7.3.9
[EnhancedKeyUsageExtension]
OID="1.3.6.1.5.5.7.3.9"
[Extensions]
1.3.6.1.5.5.7.48.1.5 = Empty
1.2. Откройте командную строку cmd. Перейдите в директорию с текстовым файлом или в будущем просто укажите полный путь при формировании запроса.
1.3. Узнаем, на какой срок сейчас выпускаются сертификаты. Для этого воспользуемся командой – certutil –getreg ca\validityperiodunits
Результат — на рис. 15.
Рисунок 15. В текущей конфигурации сертификаты выпускаются на один год
1.4. Изменим длительность выпуска сертификата:
#Изменение выпуска сертификатов с текущего состояния на длительность в 5 лет
certutil -setreg ca\ValidityPeriodUnits 5
#Перезапуск сервера
net stop certsvc
net start certsvc
1.5. Сформируем запрос и выпустим сертификат для сетевого автоответчика (рис 16.):
#Конфигурирование запроса
certreq -new <имя>.inf <имя>.req
#Формирование запроса в ЦС
certreq -submit <имя>.req
#Одобрение запроса (Можно руками через оснастку управления центром сертификации)
certutil.exe -Resubmit "Цифра запроса"
Во время конфигурирования запроса выбираем место хранения контейнера ключа и проходим процедуру ДСЧ.
Рисунок 16. Выпуск сертификата для сетевого автоответчика
1.6. Экспортируем сертификат из центра сертификации и устанавливаем его в личные сертификаты локального компьютера.
1.6.1. После запроса сертификата открываем оснастку: Certificates (Run – MMC – Add or remove Snap-ins – Certificate),
1.6.2. Выбираем сертификат, выданный для сетевого ответчика. Нажимаем правой клавишей и открываем «Все задачи (Управление закрытыми ключами (All Tasks – Manage Private keys)».
1.6.3. В открывшемся окне Permissions необходимо добавить в «Группы и пользователи (Group and Users): Network Service и выдать право Read для этой учётной записи. (рис.16.1)
Это нужно сделать, так как служба OCSP работает от лица Network Service.
Рисунок 16.1. Настройка сертификата для работы сетевого ответчика
1.7. Далее переходим в настройки самого сетевого ответчика. (рис. 17)
1.8. Нам необходимо добавить «Конфигурацию отзыва (Revocation Configuration) – «Добавить»
2. Предстоит небольшой процесс настройки конфигурации отзыва.
2.1. «Далее».
2.2. Введите имя конфигурации – «Далее».
2.3. Выбираем второй пункт: «Выбрать сертификат в локальном хранилище сертификатов (Select a certificate from the local certificate store)» – «Далее».
2.4. В следующем окне нажимаем «Обзор (Browse)» и выбираем корневой сертификат нашего ЦА – «Больше вариантов (More choices)». (рис. 17) – «Далее».
2.5. В следующем окне выбираем «Выбрать сертификат подписи вручную (Manually a signing sertificate)
2.6. В последнем окне нажимаем «Поставщик (Provider)». Здесь необходимо указать источник, из которого будут браться базовые и разностные CRL. В нашем случае: http://localhost/CDP/CA-C4Y-VPN.crl (для базового) и http://localhost/CDP/CA-C4Y-VPN+.crl (для разностного).
Рисунок 17. Управление сетевым ответчиком. (online responder management)
Рисунок 18. Прикрепляем конфигурации корневой сертификат ЦА
2.7. Осталось прицепить к нашей конфигурации выпускаемый ранее сертификат и проверить некоторые моменты.
2.7.1. Переходим в «Конфигурацию массива(array configuration)», выбираем конфигурацию и нажимаем «Назначить сертификат подписи (Assign Signing Certificate)». В появившемся окне нужно просто нажать «ОК».
2.7.2. Теперь необходимо «Обновить конфигурацию массива». Для этого выбираем «Конфигурация массива (Array configuration) – «Обновить (Refresh)»
2.7.3. После всех этих действий главное окно оснастки ocsp должно выглядеть так, как на рисунке 19.
Рисунок 19. Итоговый результат о работе сетевого ответчика
В процессе самостоятельной настройки «сетевого ответчика» может возникнуть много вопросов, особенно если нет опыта работы с Standalone центром сертификации, в котором отсутствуют шаблоны, без которых можно обойтись, но пути становятся длиннее в исполнение. Кстати говоря, если после прикрепления сертификата вы не получили заветное Working, то проверьте следующее (рис.20, 20.1):
Рисунок 20. Переходим в редактирование свойств конфигурации отзыва
Рисунок 20.1. Проверяем что в разделе «Подписи» выбран ГОСТ алгоритм шифрования
Чтобы проверить работу центра сертификации и сетевого автоответчика, выпустите сертификат для конечного пользователя, установите его и экспортируйте в какую-нибудь директорию. А после воспользуйтесь утилитой: Certutil –url /patch/test.crt
Для подробного отчёта вы можете воспользоваться: certutil –verify –urlfetch /patch/test.crt
На этом краткое руководство по развертыванию собственного центра сертификации подошло к концу. Я постарался рассказать о большинстве трудностей и нюансов, с которыми можно столкнуться в процессе работы. Надеюсь, это руководство поможет вам.
Дополнительно:
Что ещё интересного есть в блоге Cloud4Y
→ Малоизвестный компьютер SWTPC 6800
→ Сделайте Linux похожим на Windows 95
→ Бесплатные книги, полезные для IT-специалистов и DevOps
→ WD-40: средство, которое может почти всё
→ Игры для MS-DOS с открытым исходным кодом
Подписывайтесь на наш Telegram-канал, чтобы не пропустить очередную статью. Пишем только по делу.
Подготовка документов к подписи с помощью ЭЦП
Подготавливаем документы (как правило в формате MS Word). Проверяем, чтобы не было пустых страниц, была верная нумерация пунктов и т.д.
Размещаем тексты необходимых документов в виде материалов Joomla. Поскольку “Требования” действуют довольно давно в различных своих версиях, тексты скорее всего уже были выложены. Их нужно обновить, так как некоторые локальные акты, учебные программы и планы принимаются каждый год. На сайте должны быть актуальные версии.
Прямо из MS Word сохраняем тексты документов в формате PDF.
Скачиваем и устанавливаем Adobe Reader DC. Он бесплатный. Инструкций по настройке Adobe Reader для подписи в сети много. На момент написания статьи ссылка на скачивание работала, программа скачивалась.
Также потребуется, скорее всего, расширение для вашего криптопровайдера, например CryptoPro PDF. Для использования совместно с Adobe Reader этот модуль распространяется бесплатно.
Бесплатный CryptoPro PDF для Adobe Reader.
Немного об электронной подписи
Законом предусмотрены два типа электронных подписей: простая и усиленная. Последняя имеет две формы: квалифицированная и неквалифицированная.
Для того чтобы электронный документ считался подписанным простой электронной подписью необходимо выполнение в том числе одного из следующих условий:
1. простая электронная подпись содержится в самом электронном документе;
2. ключ простой электронной подписи применяется в соответствии с правилами, установленными оператором информационной системы, с использованием которой осуществляются создание и (или) отправка электронного документа, и в созданном и (или) отправленном электронном документе содержится информация, указывающая на лицо, от имени которого был создан и (или) отправлен электронный документ.
Ссылка на источник
Существует 2 вида подписей: открепленная и прикрепленная.
Открепленная электронная подпись создается в момент подписания электронного документа в отдельный файл непосредственно рядом с подписываемым файлом. Обычно это файл с таким же именем, как и подписываемый, но в формате *.sig.
Прикрепленная электронная подпись также создается в момент подписания документа, но сама подпись помещается внутрь подписываемого электронного документа. На выходе мы имеем один подписанный файл, что в целом соответствует требованию закона.
На практике у тех, кто не имеет IT-специалиста, разбирающегося в тонкостях ЭЦП, в шаговой доступности, нередко возникает вопрос: “Нужно ещё одну подпись покупать?” Ответ: нет. В каждой образовательной организации есть бухгалтерия. У бухгалтерии есть казначейская подпись “для госзакупок”. Подписывать документы для сайта можно ей.
Извлечения данных подписи из PDF в PHP
Хранение данных электронной подписи в формате PDF описывает спецификация Adobe. Также есть вопрос на StackOverflow How to retrieve digital signature information from PDF with PHP, который натолкнул [Артёма Васильева] на верные дальнейшие шаги.
В процессе подписи создаётся файл в формате pkcs7, который затем интегрируется внутрь PDF файла бинарном виде (специалисты в области криптографии меня поправят).
Далее из бинарника нужно вытащить в цепочку сертификатов в формате DER. И здесь начинаются сложности: дело в том, что openssl в php это сделать не может. Собрать такую сигнатуру у него возможность есть, а вот разобрать – нет. Проблема в том, что данные в нём записаны по алгоритму ASN.1. Поиск в интернете приводит обычно к ответам в духе “используйте shell_exec для запуска openssl” или “нафига оно надо – напишите на java микросервис”, “используйте iText [Java и .NET библиотека] – я им очень доволен”. Но, как мы понимаем, это решение не для условной провинциальной школы искусств.
Благо, обнаружилась библиотека, написанная на php, без сумасшедших зависимостей, которая умеет это всё читать, но она не знакома с российскими алгоритмами шифрования. Алгоритмы шифрования CP_GOST_R3411_12_256_R3410, CP_GOST_R3411_12_512_R3410 описаны в RFC.
Скриншот сообщения из Telegram-канала Joomla по-русски
Артём Васильев изучил документацию ГОСТ Р-34.10 и ГОСТ Р-34.11, а также RFC7836 и дописал к найденной php библиотеке для работы с ASN.1 3 класса: 2 для работы с алгоритмами шифрования по ГОСТ и один для RFC7836. Слёзы гордости и радости можно почувствовать в оригинальном сообщении в Telegram-канале Joomla-сообщества.
Установка центра сертификации (Standalone CA Windows Server 2019)
Непосредственно перед самой установкой коротко объясню особенности Standalone CA:
Не интегрирован с Active Directory (а он нам и не нужен);
Публикация сертификатов происходит через запрос на WEB-сайте. Путем автоматического или ручного подтверждения администратором ЦС (ЕМНИП, ЦС предприятия было добавлена такая возможность, не проверял её работу);
Пользователь сам вводит идентификационную информацию во время запроса сертификата;
Не поддерживает шаблоны сертификатов (из-за этого всплывут некоторые моменты, которые раскрою в процессе развертывания).
Начинаем:
1. Измените имя компьютера до установки роли, после это будет сделать невозможно. «Далее (Next)» (рис.2):
Рисунок 2. Уведомления при установки роли.
2. Добавляем роль в «Диспетчере серверов» (Server Manager), «Далее (Next)» (рис. 3):
Рисунок 3. Интерфейс «Диспетчера устройств» (Server Manager)
2.1. «Установка ролей и компонентов (Add roles and features wizard)». Нажимаем «Далее (Next)» – «Далее (Next)»;
2.2. «Тип установки: Установка ролей и компонентов (Installation type: Role-based or features-based installation». «Далее (Next)»;
2.3. «Выбор сервера (Server selection)». В нашем случае среди предложенных будет один сервер и имя компьютера. «Далее (Next)» (рис. 4);
Рисунок 4. «Выбор сервера (Server selection)»
2.4. «Роли сервера (Server roles). Здесь необходимо отметить две роли: Служба сертификатов Active Directory (Certificate Services Active Directory), Веб-сервер IIS (Web-server IIS);
Во всплывающем окне перечня нажимаем «Добавить компонент (Add features)» – «Далее (Next)»;
2.5. «Компоненты (Features) оставляем как есть — «Далее (Next)» ;
2.6. «Служба ролей (Role Services)» ЦС, необходимо выбрать:
«Центр сертификации (Certification Authority)»,
«Служба регистрации в центре сертификации через Интернет (Certification Authority Enrollment)»;
Сетевой автоответчик (Online responder) добавим уже после развертывания ЦА, в противном случае могут возникнуть проблемы.
2.7. В «Служба ролей (Role Services)» веб-сервера оставляем всё предложенное автоматически — «Далее (Next)»;
2.8. «Подтверждение (Confirmation).
На этом этапе запустится процесс установки роли.
3. После установки роли центра сертификации необходимо его настроить(рис. 5). Выбираем:
3.1. «Настроить службы сертификатов Active Directory (Configure Active Directory-Certificate Services)
Рисунок 5. Уведомление о необходимости настройки центра сертификации
3.2. Указываем учетные данные. Так как мы развертываем Standalone центр сертификации, не нужно состоять в группе «Администраторов предприятия (Enterprise Administrators)» — «Далее (Next)»;
3.3. Выбираем установленные службы ролей для настройки (Select role services to configure) ЦС: «Центр сертификации (Certification Authority)», «Служба регистрации в центре сертификации через Интернет (Certification Authority Enrollment)»;
3.3.1. При выборе центра сертификации появится окно выбора ключевого носителя – КриптоПРО CSP, в качестве носителя для создания контейнера cngWorkAround используем хранилище ключей реестра Windows – Реестр. (рис. 6)
Рисунок 6. Выбор ключевого носителя – КриптоПРО CSP
3.4. Указываем вариант установки ЦС (Specify the setup type of the CA): Автономный центр сертификации (Standalone CA). «Далее (Next)»;
3.5. Указываем тип ЦС (Specify the type of CA) – Корневой ЦС (Root CA). «Далее (Next)»;
3.6. Необходимо создать закрытый ключ ЦС, чтобы он мог создавать и выдавать их клиентам. Для этого выбираем «Создать новый закрытый ключ (Create a new private key)».
В качестве поставщика службы шифрования выбираем один из трёх предложенных (не забывайте, что 2001 год уже устарел) Crypto-Pro GOST R 34.10-2012 Strong Cryptographic Service Provider с длиной 512 и открытого ключа 1024 бита. (рис.7)
И обязательно подтверждаем: «Разрешить взаимодействие с администратором, если ЦС обращается к закрытому ключу (Allow administrator interaction when the private key is accessed by the CA)»;
Рисунок 7. Выбор криптопровайдера
3.7. Укажите имя центра сертификации и суффиксы различающего имени, данные суффиксы будут отображаться в составе сертификата в графе «Издатель (Issuer)».
СN = Certificate Name, O = Organization, L = Locale, S = Street, C = Country, E = E-mail; (рис. 8)
3.8. Указываем необходимый «срок годности (validaty period)» корневого сертификата (в нашем случае было выбрано 15 лет). «Далее (Next)»;
3.9. Указываем расположение баз данных сертификатов (certificate database location). «Далее (Next)»;
3.10. В окне «Подтверждения (Confirmation) сверяем введённую информацию – «Настроить (Configure)»
3.11. Появится окно выбора носителя для создания контейнера нашего ЦС.
Где хранятся сами контейнеры ключей:
1. Реестр: (в качестве хранилища ключей используется реестр Windows), путь хранения контейнеров ключей следующий:
Ключи компьютера: HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\CryptoPro\Settings\Keys
3.12. Далее откроется окно генерации начальной последовательности с помощью биологического ДСЧ. Для генерации случайной последовательности перемещайте указатель мыши или нажимайте различные клавиши.
3.13. После введите пароль на доступ к закрытому ключу.
3.14. Далее появится окно результатов об успешной установке компонентов (рис. 8)
Рис.8. Результаты установки
Настройка веб-сервера IIS
Теперь необходимо выполнить некоторые настройки веб-сервера: прицепить сертификат (самоподписанный или выпущенный нашим же ЦА). Кстати, он уже работает. В качестве примера выпустим самоподписанный сертификат.
1. Откроем Диспетчер служб IIS (Manager IIS) — Сертификат сервера (Server Certificates) (рис. 9);
1.1. В открывшемся окне в панели «Действия (Actions)» выберем – «Создать самоподписанный сертификат (Create Self-Signed Certificate);
1.2. Выбираем тип «Личный (Personal) и указываем «Имя сертификата (Friendly Name)»
1.3. Теперь необходимо привязать этот сертификат для доступа по https к веб-серверу.
1.3.1. Переходим «Сайты (Sites)» – Default Web Site – Bindings – добавить (Add) – выбрать https – и выбрать самоподписанный SSL-сертификат.
Рисунок 9. Диспетчер служб IIS (IIS Manager)
Также сертификат вы можете выпустить следующим образом:На этой же панели создайте запрос (Create certificate request) для выпуска сертификата через наш ЦА и дальнейшей его загрузки в IIS (Complete Certificate Request). Но это по желанию.
Пример запроса (request) для формирования запроса вручную
[NewRequest]
Subject="CN=ИмяСертификата ,O=Организация, L=Город, S=Улица, C=Страна, E=Почта"
ProviderName="Crypto-Pro GOST R 34.10-2012 Cryptographic Service Provider"
ProviderType=80
KeySpec=1
Exportable = TRUE
KeyUsage=0xf0
MachineKeySet=true
RequestType=Cert
SMIME=FALSE
ValidityPeriod=Years
ValidityPeriodUnits=2
[EnhancedKeyUsageExtension]
OID=1.3.6.1.5.5.7.3.1
В целом с веб-сервером мы закончили, в default web site вы можете увидеть, что были автоматически созданы virtual directory и applications «CertSrv». При желании можно создать отдельную виртуальную директорию под CRL’ки.
Готовый плагин для Joomla 3 и Joomla 4
Скачать готовый плагин отображения данных ЭЦП из PDF для Joomla 3 и Joomla 4. Там же можно скачать все необходимые для его работы библиотеки.
Скриншот экрана установки Joomla 4
Настройки плагина – чекер библиотек, сами настройки чуть ниже. Joomla 4.
Шорт-код в тексте материала. Joomla 4.
<amp-img layout="responsive" width="1365" height="742" src="https://habrastorage.org/getpro/habr/upload_files/b64/e27/c8c/b64e27c8c8a56b64bdb49ed4b9ef25f8.jpg" alt="Работа плагина снаружи – во фронтенде. Joomla 4. Макет вывода – тег
Работа плагина снаружи – во фронтенде. Joomla 4. Макет вывода – тег HTML5.
Viva la Joomla!
Полезные ресурсы
Ресурсы сообщества:
форум русской поддержки Joomla.
Telegram:
чат сообщества «Joomla! по-русски».
Joomla для профессионалов, разработчики Joomla.
Новости о Joomla! и веб-разработке по-русски.
вакансии и предложения работы по Joomla: фуллтайм, частичная занятость и разовые подработки. Размещение вакансий здесь.
англоязычный чат сообщества.
Как должно быть
В 2005 году Велихов проводил конференцию в Курчатнике по случаю 15 летия Рунета. Самой зажигательной лекцией, до сих пор не потерявшей актуальность, была лекция Анатолия Левенчука про госуслуги и выдачу паспорта, за который нужно ещё и заплатить. Сейчас паспорт можно выдавать бесплатно и виртуально как банковскую карту. Паспорт и любой документ — это просто запись в открытом реестре. В реестре часть данных закрыта, но по всем данным возможна сверка. Сверка может проходить даже не по самим данным, а по их временному хешу. Банкам и прочим организациям не нужны сами паспортные данные. Их интересуют сверки:
действительный ли паспорт, документ;
есть ли какие-то ограничения;
количественные характеристики связанные с документом, сколько кредитов уже набрал;
cудимости, переболел ли COVID и т.п..
Ещё очень важно иметь не много документов, а один. Совершенно же непонятно почему есть обычный паспорт и загран, да ещё у загранпаспорта раньше срок был 5 лет, а сейчас 10, при том, что у обычного от 20 до 45 лет и от 45 и до старости.
Важно не иметь возможности их потерять.
Владелец документа может в приложении либо авторизовывать запросы, либо нет. А сами запросы могут идти только в объёме установленном законом и зашитом в протокол обмена данными, чтобы никакой клерк или пограничник не мог ознакомиться с группой крови, семейным положением, количеством детей и прочим, что к нему никак не относится.
И, конечно, всё это должно быть доступно на любом языке.
Налоговая должна по API принимать закрывающие документы, онлайн-чеки, а не морочить бизнесу голову аппаратными кассами, фискальными накопителями, ОФД, операторами ЭДО.
Результаты
У нас просят документы на бумаге менее нескольких процентов клиентов.
Все документы кроме счетов-фактур можно отправлять с откреплённой ЭЦП по email, или выкладывать в ЛК в автоматическом режиме.
Для счетов-фактур придётся использовать оператора ЭДО.
Если у вас где-то просят доверенность или документ на бумаге, то подписывайте его УКЭП и отправляйте через сайт или по email. Кстати, проверено с госорганами, например, ФАС, принимают.
Дата-центр ITSOFT — размещение и аренда серверов и стоек в двух дата-центрах в Москве. За последние годы UPTIME 100%. Размещение GPU-ферм и ASIC-майнеров, аренда GPU-серверов, лицензии связи, SSL-сертификаты, администрирование серверов и поддержка сайтов.
Объективные плюсы ЭДО
Доставка документа мгновенная и бесплатная по электронной почте или через ЛК или API.
Создание документа автоматическое, мгновенное и бесплатное.
Быстрый импорт данных для XML-форматов.
Доверенность можно выписать без нотариуса для всех случаев, где в законе явно не прописано, что требуется нотариальная доверенность.