Как удивить банк или государственного чиновника, который требует подпись на бумаге, используя криптопро хабр и ЭДО без операторов

Как удивить банк или государственного чиновника, который требует подпись на бумаге, используя криптопро хабр и ЭДО без операторов Электронная цифровая подпись
Содержание
  1. ЭДО — это просто, как внедрили мы автоматическое подписание документов
  2. Настройка OCSP — сетевого ответчика (Online responder)
  3. Преимущества компании КриптоПро
  4. Среди главных преимуществ КриптоПро выделяют:
  5. На самом деле всё куда хуже
  6. Установка сетевого ответчика (Online responder)
  7. Немного об электронной подписи
  8. Установка центра сертификации (Standalone CA Windows Server 2019)
  9. Настройка веб-сервера IIS
  10. Как работает КриптоПро
  11. Главные функции КриптоПро
  12. Кому нужна программа КриптоПро
  13. Начну с того, что всё плохо
  14. Как подписать документ ЭЦП с помощью КриптоПро 5
  15. Процесс настройки
  16. Как можно создавать ЭЦП ручками
  17. Через Оператора ЭДО. (Самый популярный вариант среди коммерческих организаций)
  18. С помощью плагинов, установленных в Word, Acrobat Reader
  19. С помощью специальных программ
  20. С помощью онлайн-сервисов
  21. Настройка центра сертификации
  22. Чтение данных ЭЦП из PDF в Joomla 3 и Joomla 4
  23. Создание плагина для Joomla
  24. Работа с библиотеками в Joomla
  25. Различия в указании namespaces  в Joomla 3  и Joomla 4
  26. Готовые библиотеки для чтения ЭЦП в Joomla
  27. Метод onContentPrepare в Joomla
  28. Использование Joomla Layout для результирующего HTML
  29. Как всем перейти на ЭДО
  30. Извлечения данных подписи из PDF в PHP
  31. Примеры кода
  32. Подготовка документов к подписи с помощью ЭЦП
  33. Сопротивление и проблемы
  34. Контекст применения
  35. .
  36. Можно ли скачать КриптоПро бесплатно

ЭДО — это просто, как внедрили мы автоматическое подписание документов

Основная нагрузка у нас на закрывающие документы. В дополнение к ним: акты сверки, доверенности, счета на оплату. Договор у нас является офертой, поэтому с ним проще.

Распечатать документы, подписать, упаковать в конверты, отправить — в реальности дурацкая и никому ненужная работа. Переводится масса бумаги, гробятся миллионы человекочасов в масштабах страны. Нулевая добавочная стоимость. Потом вся эта макулатура выкидывается на помойку, даже во вторсырьё не попадает. Поэтому начали мы именно с закрывашек.

Для работы с ЭДО необходимо иметь действующий сертификат квалифицированной электронной подписи (КЭП). Его можно получить с 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 не лишним будет подписать.

Настройка 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-канал, чтобы не пропустить очередную статью. Пишем только по делу.

Преимущества компании КриптоПро

Общество с ограниченной ответственностью «КриптоПро» существует с 2000 года. Основная деятельность ООО — разработка средств криптографической защиты информации (СКЗИ) и электронной цифровой подписи.

Среди главных преимуществ КриптоПро выделяют:

1

Опыт работы компании в информационной безопасности. Программа широко распространена — бизнес обычно ставит КриптоПро в качестве стандартного софта для работы с ЭЦП

2

Совместимость КриптоПро с альтернативным софтом. Прочитать сертификат можно даже в том случае, если для его установки использовалось другое ПО. Компания предлагает версию КриптоПро для операционных систем Mac, Linux и Windows. Для корректного использования не нужны эмуляторы или другие дополнительные способы запуска софта

3

Консультации. Если пользователь ЭЦП не знает, как обращаться с софтом, можно проконсультироваться с техподдержкой криптопровайдера

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

На самом деле всё куда хуже

Публичная кадастровая карта, точнее её бэкенд, работает на каком то по мировым меркам ноунеймовом сервере “GIS WebService SE” (на Эльбрусах ещё поди запущен) от КБ Панорама – разработчики всей отечественной картографии, на софте которых и делается ЕЭКО.

Сервер этот (ну насколько я помню, ПКК то лежит опять) генерирует растровые тайлы самой кадастровой карты, ЕЭКО и других слоёв. И все юзеры просто берут ссылки на эти растровые тайлы и подгружают их в свои ГИС, чтобы работать над своими проектами. Либо массово качают их на свои сервера – по традиции – поэтому мощности инфраструктуры не хватает и часто ПКК не работает.

И это вместо того чтобы сделать нормальные открытые всем общепринятые векторные тайлы через нормальные API. Кстати, API у них есть, но отродясь не работало, точнее они вроде дают доступ только государственным сервисам, по IP наверное.

Кстати о тайлах – экскурс в историю – 10 лет назад предыдущая версия обновленных карт Генштаба (до того работали с их сканами) опять же в виде растровых тайлов была выложена на сайте maps.ggc.ru – оттуда она была быстро удалена, но до того успешно скачана энтузиастами и выложена на торрент-трекеры и личные сервера энтузиастов – так и жили.

Это чтобы не связываться с государственными бюрократами – они для заказа векторных листов (!) карт использовали сервис, генерировавший PDF заявления, которые нужно было слать им на мейл – и это происходило до недавнего времени! А как сейчас не знаю, я не хочу покупать “КриптоПро”.

Установка сетевого ответчика (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.

Немного об электронной подписи

Законом предусмотрены два типа электронных подписей: простая и усиленная. Последняя имеет две формы: квалифицированная и неквалифицированная.

Для того чтобы электронный документ считался подписанным простой электронной подписью необходимо выполнение в том числе одного из следующих условий:

1. простая электронная подпись содержится в самом электронном документе;

2. ключ простой электронной подписи применяется в соответствии с правилами, установленными оператором информационной системы, с использованием которой осуществляются создание и (или) отправка электронного документа, и в созданном и (или) отправленном электронном документе содержится информация, указывающая на лицо, от имени которого был создан и (или) отправлен электронный документ.

Ссылка на источник

Существует 2 вида подписей: открепленная и прикрепленная.

Открепленная электронная подпись создается в момент подписания электронного документа в отдельный файл непосредственно рядом с подписываемым файлом. Обычно это файл с таким же именем, как и подписываемый, но в формате *.sig.

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

На практике у тех, кто не имеет IT-специалиста, разбирающегося в тонкостях ЭЦП, в шаговой доступности, нередко возникает вопрос: “Нужно ещё одну подпись покупать?” Ответ: нет. В каждой образовательной организации есть бухгалтерия. У бухгалтерии есть казначейская подпись “для госзакупок”. Подписывать документы для сайта можно ей.

Установка центра сертификации (Standalone CA Windows Server 2019)

Непосредственно перед самой установкой коротко объясню особенности Standalone CA:

  • Не интегрирован с Active Directory (а он нам и не нужен);

  • Публикация сертификатов происходит через запрос на WEB-сайте. Путем автоматического или ручного подтверждения администратором ЦС (ЕМНИП, ЦС предприятия было добавлена такая возможность, не проверял её работу);

  • Пользователь сам вводит идентификационную информацию во время запроса сертификата;

  • Не поддерживает шаблоны сертификатов (из-за этого всплывут некоторые моменты, которые раскрою в процессе развертывания).

Читайте также:  криптопро csp класс защиты

Начинаем:

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’ки.

Как работает КриптоПро

Первым делом пользователь устанавливает КриптоПро на компьютер, чтобы пользоваться подписью. Программа обращается к сертификату на ПК, флешке, токенах или других носителях, потом завершает работу установкой подписи на документе.
Электронная подпись не может корректно функционировать в условиях отсутствия закрытого ключа. Поэтому корректное использование КриптоПро заключается в том, что софт сначала проверяет сертификат, потом подтверждает, и только последняя стадия — шифровка и отправка документа.

Главные функции КриптоПро

1

Защита информации. Для сохранности ЭЦП её надо правильно зашифровать. С последней задачей корректно справляется указанный софт. Последний релиз добавил множество полезных функций относительно степени защиты информации. Такие вещи, как хэширование и имитозащита, существовали и в старых версиях. Тестирования, проведённыенезависимыми экспертами, показывают хороший результат

2

Создание ключей шифрования. Допускается использование разных типов носителей

3

Форммирование ПИН-кода. Эта функция используется, чтобы усложнить работу злоумышленнику и обеспечить пользователя дополнительной защитой

4

Защита информации от случайных или преднамеренных потерь. Последние версии КриптоПро показали надёжность софта

5

Защита от вредоносного кода, а также целенаправленного взлома

Кому нужна программа КриптоПро

Используют КриптоПро все, кому нужен криптографический сертификат для установки электронного реквизита в документ. Не обойтись без этой программы работникам на государственных площадках.

Законодатель определил требования для каждого участника производственного процесса на таких площадках. Обязательно нужен усиленный квалифицированный вариант. Для этого ставят КриптоПро даже в том случае, если предполагается работа всего с одного компьютера. Последние нововведения делают программу нужной в том числе тем, кто использует онлайн-кассы.

Сферы работы с электронным сертификатом со временем будут только увеличиваться.

Начну с того, что всё плохо

В конце прошлого года была наконец введена в эксплуатацию государственная информационная система ведения Единой электронной картографической основы (ЕЭКО) – нормальные современные актуальные карты.

Также Публичная кадастровая карта (ПКК) получила государственную электронную картографическую подложку – с тех пор их сайт редко работает.

Параллельно появился еще вот этот неясный сервис типа магазина открытых данных, его подложку можно спутать с ЕЭКО, однако это не она, здесь карты не обновлены и (умышленно) куда менее детальны.

Однако, для получения информации в векторном виде оператор ЕЭКО – “Центр геодезии, картографии и инфраструктуры пространственных данных”, ссылаясь на законодательство, требует использовать дорогостоящие средства криптозащиты “КриптоПро” – вот полюбуйтесь:

В рамках реализации требований по защите информации в соответствии с Федеральными законами № 149-ФЗ от 27.07.2010 г. «Об информации, информационных технологиях и о защите информации», № 152-ФЗ от 27.07.2006 г. «О персональных данных» и приказа ФСТЭК России от 11 февраля 2013 г. № 17 «Об утверждении Требований о защите информации, не составляющей государственную тайну, содержащейся в государственных информационных системах», для защиты передачи конфиденциальной информации, в том числе персональных данных, необходимо для подключения к ресурсам ГИС ФППД и ГИС ЕЭКО необходимо использовать защищенное подключение.

Но в приведенных законах нет такой строчки, а в приказе ФСТЭК написано прямо противоположное:

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

ЕЭКО создаётся и предоставляется на основе следующего закона. И кто мешает использовать общедоступную криптографию? Для меня здесь очевиден преступный сговор “Центра геодезии, картографии и ИПД” с “КриптоПро”.

Как подписать документ ЭЦП с помощью КриптоПро 5

Для того чтобы подписать электронный документ, нужны установленные на компьютер СКЗИ Криптопро версии 5.0 и действующий сертификат электронной подписи.

Шаг 1. Найдите в списке установленных программ приложение «Инструменты КриптоПро». Для этого в строке поиска (1) введите название приложения (2) и выберите нужное из выпавшего списка (3).

Выберите нужное приложение

Выберите нужное приложение

Шаг 2.В главном окне нажмите на кнопку «Показать расширенные».

Нажмите на кнопку «Показать расширенные»

Шаг 3. Откроется список дополнительных разделов. В нём выберите «Создание подписи» (1). Справа откроется список сертификатов, в котором нужно выбрать вашу подпись (2). Затем нажмите на кнопку «Выбрать файл для подписи» (3).

Нажмите на кнопку «Выбрать файл для подписи»

Шаг 4. В открывшемся окне проводника выберите файл, который нужно подписать электронной подписью.

Выберите файл

Шаг 5. В строке адреса отразится путь к выбранному файлу. Убедитесь, что выбрали правильный сертификат и файл для подписи, и нажмите на кнопку «Подписать».

Выбор путь к файлу

Шаг 6. Если не возникло ошибок, внизу окна появится надпись «Создание подписи завершилось успехом».

«Создание подписи завершилось успехом»

Шаг 7. В папке, где хранится файл для подписи, появится зашифрованный файл с таким же названием, но с расшсайтирением *.P7S.

Файл с расширением с расширением *.P7S

Процесс настройки

Ранее я не сталкивался с центрами сертификациями. Поскольку ОС Windows Server мне ближе, решил развернуть ЦС с использованием Server Manager. Разворачивать контроллер домена не нужно, так как сертификаты будут выдаваться внешним пользователям. Соответственно, можно обойтись «автономным» центром сертификации, подробнее о нём расскажу позже.

Перед развертыванием центра сертификации необходимо:

  • Установить СКЗИ КриптоПро CSP 5.0.12330:

  • Установить КриптоПро ЭЦП Browser plug-in;

Инсталляцию производим через «Дополнительные опции»

  1. Выбираем язык установки, уровень защиты КС1 (другие уровни защиты требуют дополнительных аппаратных средств защиты);

  2. В разделе «Установка компонентов» проверяем, что добавлен «Криптопровайдер уровня ядра ОС»; (рис. 1)

Рисунок 1. Установка дополнительных компонентов «КриптоПро CSP»

Криптопровайдер уровня ядра ОС необходим для работы криптопровайдера в службах и ядре Windows.

3.  В следующем окне оставляем пункты:

  • Зарегистрировать считыватель «Реестр» (позволит сохранять контейнеры ключей в реестр);

  • Усиленный контроль использования ключей;

  • Не разрешать интерактивные сервисы Windows;

4. Также «КриптоПро» предложит добавить сертификаты своих центров сертификации;

5. Устанавливаем, перезагружаемся.

Как можно создавать ЭЦП ручками

Через Оператора ЭДО. (Самый популярный вариант среди коммерческих организаций)

Позволяют подписать документ внутри системы и направить контрагенту через эту же систему. На документе при печати есть оттиск “Подписано ЭЦП”. Нужно купить подписку у оператора ЭДО. Например, Контур.диадок. Подходит ли обмена формализованными документами, формат которых регламентирован: счет-фактуры, накладные, акты, УПД и т.п.

Минусы — платно, сложность обмена документами между разными операторами.

Плюсы — проверка документов на соответствие текущим обязательным форматам. Возможность интеграции с 1С, по API

Есть проверка действия КЭП. Статус-бар сразу видно в интерфейсе. Уведомление при недействительной КЭП.

Внимание! Оператор не имеет информации о полномочиях подписанта. Эту информацию нужно запрашивать у контрагента. Доверенность лучше хранить у себя.

С помощью плагинов, установленных в Word, Acrobat Reader

Позволяет подписать документ сразу в редакторе. После подписания документ недоступен для редактирования. Тут же возможно быстрая проверка действительности КЭП. Вшита в сам документ.

Нужно установить дополнение/плагин к программе (редактору). Подходит для:

  • подписания (визирования) документов внутри компании;

  • оперативной отправки документов контрагентам;

  • подписания документов, отправляемых в гос. органы.

Минусы: платно и не универсально.

Плюсы: если вы работаете преимущественно в одном редакторе — просто и быстро в использовании. Есть проверка действия КЭП. Кнопка проверки на статус-баре.

Читайте также:  Обмен актами по электронной почте — Блог

С помощью специальных программ

Позволяет выбрать документ и подписать его КЭП на компьютере оффлайн. Подпись формируется отдельным файлом. При изменениях в самом файле, к которому относится КЭП, сама ЭЦП становится недействительна. Нужно установить отдельную программу. Например, КриптоАРМ.

Подходит для всех случаев из предыдущего раздела.

Минусы: платно. Достаточно сложно в использовании. Малопопулярно, часто требуется дополнительно давать инструкцию контрагентам о том, как с этим работать.

Плюсы: Нет привязки к онлайн-сервисам. Не нужна регистрация/авторизация.

Наша инструкция: https://www.dropbox.com/sh/7h12dkdemcy65ep/AAArAS_dTL-bh2nXzfQD1RMja?dl=0

Нет проверки действия КЭП. Требуется проверка через КриптоПро..

С помощью онлайн-сервисов

Позволяет выбрать документ через интерфейс и подписать его КЭП. Подпись формируется отдельным файлом. При изменениях в самом файле, к которому относится КЭП, сама КЭП становится недействительна. Например, Контур.крипто

Подходит для всех случаев из предыдущего раздела.

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

Плюсы: просто в использовании. Бесплатно.

Проверка действия ЭЦП: Нет. Требуется проверка через КриптоПро.

Настройка центра сертификации

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.

Чтение данных ЭЦП из PDF в Joomla 3 и Joomla 4

В Joomla тексты документов выкладываются материалами. Добавить к материалу pdf-файл для скачивания и отобразить информацию о подписанте из ЭЦП можно несколькими способами:

  1. Обычной ссылкой на файл в тексте материала. В таком случае на потребуется системный или контент-плагин, который будет обрабатывать все ссылки в материале, выделять из них ссылки только на pdf и далее проверять есть ли подпись.

  2. Сделать пользовательское поле для материалов и добавлять файлы только в эти поля. Здесь вариантов работы несколько от кустарных и неправильных, когда обработка ссылки будет идти прямо в шаблоне (не делайте так!) до оформления кода в плагин пользовательского поля. Вот простой мануал по созданию собственного плагина пользовательского поля для Joomla.

  3. Вставить специальный шорт-код. Можно вставить шорт-код, в параметрах которого будет указан путь к файлу для парсинга. В таком случае код плагина упростится, но чуть усложнится работа контент-менеджера.

Именно третий вариант я выбрал для создания плагина.

Создание плагина для 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>[email protected], [email protected]</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('&quot;', '&apos;', '`'), $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-&gt;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());
	}

Как всем перейти на ЭДО

Не люблю большевиков, но в 1918 году они просто проехались по типографиям и изъяли лишние буквы. Пора принтеры отбирать у бюрократов. 🙂 Это, конечно, не наши методы. Остаётся пулять в бюрократов файлами с ЭЦП и требовать на основании закона принимать такие документы. Нужно ставить динозавров перед фактом. Нужно проталкивать перемены вокруг себя.

Читайте также:  Анализ причин поглощения бурового раствора, карбонаты.

Извлечения данных подписи из 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-сообщества.

Примеры кода

Извлечь pkcs7 из pdf на php можно регулярным выражением, так как подпись в файле выглядит как длинная кодированная строка между двух угловых скобок &lt;&gt;, находящаяся в массиве 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).

Подготовка документов к подписи с помощью ЭЦП

  1. Подготавливаем документы (как правило в формате MS Word). Проверяем, чтобы не было пустых страниц, была верная нумерация пунктов и т.д.

  2. Размещаем тексты необходимых документов в виде материалов Joomla. Поскольку “Требования” действуют довольно давно в различных своих версиях, тексты скорее всего уже были выложены. Их нужно обновить, так как некоторые локальные акты, учебные программы и планы принимаются каждый год. На сайте должны быть актуальные версии.

  3. Прямо из MS Word сохраняем тексты документов в формате PDF.

  4. Скачиваем и устанавливаем Adobe Reader DC. Он бесплатный. Инструкций по настройке Adobe Reader для подписи в сети много. На момент написания статьи ссылка на скачивание работала, программа скачивалась.

  5. Также потребуется, скорее всего, расширение для вашего криптопровайдера, например CryptoPro PDF. Для использования совместно с Adobe Reader этот модуль распространяется бесплатно.

Бесплатный CryptoPro PDF для Adobe Reader.


Сопротивление и проблемы

Уже несколько лет, как задумал внедрить у нас электронный документооборот (ЭДО). Конечно, мы давно подключились к Контур.Диадок. Но там и сейчас далеко не все. А в то же время есть п. 1 ст. 6 63-ФЗ, который говорит, что:

“Информация в электронной форме, подписанная квалифицированной электронной подписью, признается электронным документом, равнозначным документу на бумажном носителе, подписанному собственноручной подписью, и может применяться в любых правоотношениях в соответствии с законодательством Российской Федерации, кроме случая, если федеральными законами или принимаемыми в соответствии с ними нормативными правовыми актами установлено требование о необходимости составления документа исключительно на бумажном носителе.”

Давно пора всё подписывать усиленной квалифицированной электронной подписью (УКЭП). Проверить подпись элементарно!

  1. На сайте Государственных услуг, выбираем раздел «— электронного документа. ЭП — отсоединенная, в формате PKCS#7».

  2. Загружаем файл документа и файл подписи.

  3. Нажимаем «Проверить» и смотрим результат.

Даже системы ЭДО типа Контур.Диадок по сути и не нужны. Мы сделали для клиентов специальный раздел ЭДО на сайте. В договор, ЛК, рассылки счетов и закрывающих документов мы добавили информацию про ЭДО. Это не помогало. Люди, а особенно бухгалтеры, консервативны. От нас всё равно требовали бумагу. Тогда мы пошли на хитрость. Мы разослали такое письмо, мол вы не против?! А народ пассивен, и вообще в массе забыл, как это — быть против.

С 1 июля для отслеживаемых товаров обязательно использовать электронные счета-фактуры.  43% наших контрагентов уже перешли на ЭДО, а в ближайшее время вынуждены будут перейти и остальные. Вместо отправки бумажных документов мы планируем рассылать по электронной почте и предоставлять для скачивания в ЛК все документы с УКЭП. Согласно п.1 ст. 6 63-ФЗ такие документы приравнены к собственноручной подписи.

Также можно обмениваться документами в ЭДО Контур.Диадок и других операторов.

Если вы против перехода на электронный документооборот и заботы о природе, пожалуйста, напишите нам о причинах ответным письмом.

Давайте идти в ногу со временем вместе!

Веб-студия и дата-центр ITSOFT

И почти никто не сказал, что он против.

Самый большой проблемой был страх сотрудников перед клиентами. Неспособность реально оценить масштаб проблемы. Боязнь перемен. Собственные сотрудники постоянно боятся что-то менять, на основе требований одного клиента почему-то делают обобщение в отношении всех клиентов. Перемены — это боль и для них, и для клиентов, ведь был уже отлаженный процесс, а тут нужно по-другому. Один клиент требует счёт с подписью генерального. Хоть бы подумал, в состоянии ли генеральный тысячи счетов подписать. Другой сотрудник говорит: “Нельзя клиенту предложить документы в ЛК с откреплённой подписью, так как с ним ЭДО через оператора”. Утверждение ни на чём не основано и прямо противоречит 63-ФЗ, но вокруг просто море чеховских человеков в футляре: нельзя, как бы чего не вышло.

Это сопротивление приходилось прорубать, как Петру I окно в Европу.

С появлением 63-ФЗ давно уже можно было перейти на ЭДО. Однако до сих пор офисный планктон впадает в ступор когда присылаешь файл с ЭЦП. Особенно банковские работники. Получив файл с подписью, ссылкой на закон и методом проверки на Госуслугах, система у них зависает. Отказать они не могут, но и что делать не знают. Для них это как в первый раз увидели оплату телефоном. Шок!

Мы 1.5 года уже судимся с ВТБ. ВТБ решил, что может не признать моё письмо подписанное ЭЦП о закрытии счёта. Уже прошли первую инстанцию, апелляцию, развернули дело в кассации, опять проиграли в первой инстанции, в апелляции, сейчас кассацию снова ждём. Но мы до Верховного Суда дойдём и поставим точку в этом вопросе. Либо суду придётся признать, что 63-ФЗ и пункт 1 статьи 859 ГК РФ не действуют в РФ либо мы победим. Мы ступили в прошлой кассации, надо было там просить не возвращать дело на пересмотр, а выносить решение. Первая кассация возвращая дело фактически подтвердила здравый смысл и нашу правоту, но суд решил продолжать юлить. И дело пересматривала та же судья, что в первый раз. Мне казалось, после кассации она должна была исправиться.

Контекст применения

Не секрет, что на 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. Но, требования закона одинаковы и для столичного ВУЗа и для условной музыкальной школы небольшого уездного городка.

.

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

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.

Ну что, распирает гордость за державу?

Проголосовали 60 пользователей.

Воздержались 33 пользователя.

Можно ли скачать КриптоПро бесплатно

Производитель даёт возможность бесплатно скачать, начать работу и пользоваться программой. Скачать программу можно на официальном сайте производителя СКЗИ КриптоПро CSP. Но у программы есть бесплатный тестовый период, срок действия которого составляет 3 месяца. Запустить последний раз можно через 90 дней после установки софта.

Чтобы работа продолжалась, бесплатная версия не подходит, нужно покупать лицензию. Если планируется работать с одним сертификатом с одного компьютера, потребуется годовая лицензия.

Если пользователь скачал и купил программу для работы с ЭЦП с одного компьютера, софт привязывается к конкретному устройству. Годовая электронная лицензия не подходит, если пользователь хочет использовать большее количество ЭП. Бесплатная программа тоже не подходит. Требуется продлить разрешение на применение нужного количества ЭП на одном компьютере либо выбрать бессрочный вариант.

Существуют браузерные версии в форме плагина. Это бесплатный вариант, называющийся КриптоПро ЭЦП Browser plug-in. Плагин КриптоПро скачали миллионы юзеров. Дополнение эффективно, но действует исключительно в браузере.

Также на официальном сайте КриптоПро можно скачать дополнительные программные продукты для специальных нужд — например, для того, чтобы подписывать электронные документы в формате PDF или Word, работать в системе СМЭВ и т.д.

Официальный сайт содержит актуальные версии программных продуктов КриптоПро, которые поддерживают работу с ГОСТ Р 34.10-2012.

Оцените статью
ЭЦП Эксперт
Добавить комментарий