- Настройка базовой безопасности в Elasticsearch
- Онлайн курс по Kubernetes
- Помогла статья? Подписывайся на telegram канал автора
- Механизм криптографии в платформе «1с
- Кто может выдавать электронные подписи?
- Настройка TLS в Elasticsearch
- Квалифицированная электронная подпись для бизнеса
- Сборка утилиты конвертирования ключа
- Компиляция OpenSSL библиотеки
- Компиляция privkey
- Формирование файла закрытого ключа private. key
- Пользуемся закрытым ключом private. key для подписывания файла file. txt
- Проверяем подпись
- Электронная подпись
- Трудности внедрения криптографии и эп в организациях
- На какой USB-токен можно записать КЭП?
- Возможно ли оформить квалифицированную электронную подпись для главного бухгалтера или другого сотрудника?
- Добавление электронной подписи в документ pdf
- Читаем закрытый ключ и конвертируем
- Вопросы
- Как долго выдается КЭП ФНС?
- Установка Elastic Enterprise Search
- Файл masks. key
- Кто может получить КЭП ФНС?
- Файл header. key
- Заключение
Настройка базовой безопасности в Elasticsearch
Начнём настройку с того, что выполним базовые рекомендации по безопасности в кластере elasticsearch. Для этого активируем настройку xpack.security. Добавляем в конфиг elasticsearch:
xpack.security.enabled: true
После этого перезапустите службу elasticsearch:
# systemctl restart elasticsearch
Теперь сгенерируем пароли к встроенным учётным записям (built-in users) elastic. Для этого запускаем утилиту elasticsearch-setup-passwords. По умолчанию она находится в папке /usr/share/elasticsearch/bin.
# /usr/share/elasticsearch/bin/elasticsearch-setup-passwords auto

Сохраните где-то эти учетные данные. Они нам понадобятся далее, а больше вы их нигде не увидите. Более подробно о работе этой утилиты читайте в документации – elasticsearch-setup-passwords.
В настоящий момент Kibana не будет иметь доступ к кластеру. Чтобы это исправить, добавьте в её конфигурационный файл параметры:
xpack.security.enabled: true elasticsearch.username: "kibana_system" elasticsearch.password: "fDhdXdVfpGc9iAWKcu0w"
Перезапустите Kibana:
# systemctl restart kibana
Доступ через web интерфейс снова будет доступен, только теперь необходимо пройти встроенную в Kibana авторизацию. Для этого используйте созданный ранее пароль для учётной записи elastic.

Если используете Logstash, то для него тоже необходим доступ с использованием учетной записи, которую надо создать. Как это сделать, подробно описано в инструкции – Configuring Security in Logstash. Необходимо в Kibana перейти в раздел Stack Management -> Roles и добавить роль logstash_writer. Права сделать следующие:
- cluster – manage_index_templates и monitor
- indices – выбрать индексы, которые создает logstash и назначить им права all.

Затем переходите в раздел Users, добавляете пользователя logstash_writer, указываете пароль и назначаете ему ранее добавленную роль. После этого в конфигурации logstash, отвечающей за правила output, добавьте информацию об этой учетной записи:
output { elasticsearch { user => logstash_internal password => OMOFYuIOFcHLDyCBnzGU hosts => "localhost:9200" index => "nginx-%{+YYYY.MM.dd}" }
}Перезапустите logstash:
# systemctl restart logstash
Если всё в порядке, то переходите к следующему разделу. Если что-то не работает, то разбирайтесь для начала с этой настройкой.
Онлайн курс по Kubernetes
Онлайн-курс по Kubernetes – для разработчиков, администраторов, технических лидеров, которые хотят изучить современную платформу для микросервисов Kubernetes. Самый полный русскоязычный курс по очень востребованным и хорошо оплачиваемым навыкам. Курс не для новичков – нужно пройти вступительный тест.
Если вы ответите “да” хотя бы на один вопрос, то это ваш курс:
- устали тратить время на автоматизацию?
- хотите единообразные окружения?;
- хотите развиваться и использовать современные инструменты?
- небезразлична надежность инфраструктуры?
- приходится масштабировать инфраструктуру под растущие потребности бизнеса?
- хотите освободить продуктовые команды от части задач администрирования и автоматизации и сфокусировать их на развитии продукта?
Сдавайте вступительный тест по ссылке и присоединяйтесь к новому набору!.
Помогла статья? Подписывайся на telegram канал автора
Анонсы всех статей, плюс много другой полезной и интересной информации, которая не попадает на сайт.
Механизм криптографии в платформе «1с
Механизм криптографии в платформе появился с версии 8.2 – это достаточно молодой механизм. Сама платформа не содержит криптоалгоритмы, она содержит только вызовы и объекты, с помощью которых можно обращаться к криптосредствам, находящимся на компьютере:
- для Windows – это интерфейс CryptoAPI;
- для Linux таких интерфейсов нет, идет непосредственное обращение к модулям криптографии.
Отсюда становится понятно, что криптографию можно применять, только если на компьютере установлено криптосредство. И, с другой стороны, что саму платформу «1С:Предприятие» не требуется сертифицировать с точки зрения криптографии.
Основные криптографические операции в платформе «1С:Предприятие 8»:
- Вы знаете, что платформа может работать в разных режимах: толстый, тонкий, веб-клиент, внешнее соединение и мобильное приложение. Во всех этих режимах запуска криптография поддерживается – для мобильного приложения поддержка криптографических механизмов появилась с версии 8.3.10. Я бы рекомендовал читать «Синтаксис-помощник» и смотреть, какие методы доступны в том или ином режиме запуска, потому что там есть ограничения.
- Платформа позволяет работать с сертификатами открытого ключа (X.509), которые установлены на компьютер. Мы не можем выпустить новый сертификат или запросить его выпуск, мы работаем только с тем, что имеем – с помощью механизмов платформы мы можем найти сертификат на компьютере, прочитать его атрибуты, выгрузить его в файл и проверить, насколько он валидный.
- Я на своей практике часто сталкивался с непониманием того, как в платформе работает шифрование и расшифровка. Это особенно важно, когда Вы делаете интеграцию с каким-то внешним подрядчиком, который работает не на 1С. Когда Вы зашифровали документ, отправили его на ту сторону, а там пробуют расшифровать. Например, часто возникают вопросы, если при настройке криптопровайдера в 1С был указан алгоритм ГОСТ 28147-89, который является симметричным, а при расшифровке требуется обращение к закрытому ключу. Напомню, что симметричный алгоритм шифрования подразумевает, что для шифрования и расшифровки Вы используете один и тот же ключ. А ассиметричное шифрование – это когда данные шифруются с помощью открытого ключа, а для расшифровки используется другой, закрытый (секретный) ключ. Подрядчики спрашивают: «Но Вы же сказали, что алгоритм шифрования симметричный, почему тогда при расшифровке нужна закрытая часть ключа?» Давайте разберемся, как работает механизм шифрования в платформе:
- случайным образом создается некий ключ фиксированной длины, с помощью которого набор данных шифруется по симметричному алгоритму;
- затем сам ключ шифруется асимметричным алгоритмом с помощью публичного ключа сертификата-получателя;
- шифрование с помощью симметричного алгоритма работает быстрее – мы им большой объем данных зашифровали, а потом маленький ключ фиксированной длины быстро шифруем с помощью асимметричного алгоритма;
- зашифрованные данные, список сертификатов-получателей и сам зашифрованный ключ упаковываются в один пакет данных по спецификации PKCS#7;
- этот пакет отправляется на сторону получателя;
- а расшифровка работает в обратном порядке.
- Подписание и проверка электронной подписи. При подписании средствами платформы идет обращение к закрытой части ключа и производится встроенная в платформу проверка целостности (математической валидности) подписи. С точки зрения юридической значимости этого недостаточно. Если Вы хотите проверить электронную подпись под документом, Вы должны проверить:
- действие сертификата;
- математическую валидность данных, которые Вы прислали.
Именно так сделано в механизме БСП – об этом речь пойдет чуть позже. Платформа этого не делает.
Кто может выдавать электронные подписи?
В 2021 году количество организаций, выдающих КЭП, значительно сократилось, так как большинство коммерческих удостоверяющих центров утратили аккредитацию. C 2022 года право создавать КЭП принадлежит только УЦ ФНС России и его доверенным лицам, которым ВТБ является с октября 2021 года
Настройка TLS в Elasticsearch
Далее нам нужно настроить возможность соединения с elasticsearch по tls. Без этого не заработает авторизация через api_key, которую будет использовать служба Enterprise Search. Для этого сгенерируем самоподписанные сертификаты, используя утилиту elasticsearch-certutil. Сгенерируем с её помощью CA сертификат, которым будем подписывать все остальные.
# /usr/share/elasticsearch/bin/elasticsearch-certutil ca

Созданный сертификат будет положен в директорию /usr/share/elasticsearch. Теперь сгенерируем клиентский сертификат с использованием CA, выпущенного ранее.
# /usr/share/elasticsearch/bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12
На выходе получим файл elastic-certificates.p12, который включает в себя сам сертификат, приватный ключ и CA. В общем, полный набор, который нам необходим. Копируем оба сертификата в /etc/elasticsearch. И обязательно назначьте права доступа к этим сертификатам пользователю elasticsearch.
# cd /etc/elasticsearch # chown root:elasticsearch elastic-stack-ca.p12 elastic-certificates.p12 # chmod 0660 elastic-stack-ca.p12 elastic-certificates.p12
Редактируем конфигурационный файл elasticsearch, добавляя туда следующие параметры:
xpack.security.authc.api_key.enabled: true xpack.security.transport.ssl.enabled: true xpack.security.transport.ssl.verification_mode: certificate xpack.security.transport.ssl.client_authentication: required xpack.security.transport.ssl.keystore.path: elastic-certificates.p12 xpack.security.transport.ssl.truststore.path: elastic-certificates.p12
Перезапустите elasticsearch и проверьте, что всё в порядке. Этих минимальных настроек будет достаточно для работы Elastic Enterprise Search. При желании, можно и все http запросы к кластеру настроить на https, но у меня не получилось это сделать с самоподписанным сертификатом, только с настоящим. В Kibana можно было настроить доверие к самоподписанному сертификату, а в Elastic Enterprise Search не получилось. Я не стал сильно разбираться и просто взял валидный сертификат.
Если вы хотите все, чтобы все запросы к кластеру были по https, то добавьте дополнительно следующие параметры:
xpack.security.http.ssl.enabled: true xpack.security.http.ssl.key: /etc/elasticsearch/private.key xpack.security.http.ssl.certificate: /etc/elasticsearch/cert.pem xpack.security.http.ssl.certificate_authorities: /etc/elasticsearch/ca-bundle.pem
В данном случае используется действующий сертификат, купленный на год. Можно использовать и бесплатные сертификаты от Let’s Encrypt, но придётся рассмотреть отдельно вопрос перезапуска всех служб, которые будут зависеть от этих сертификатов. Также во всех службах, которые будут обращаться к elasticsearch, надо не забывать указывать подключение через https, а не http и обязательно по имени домена, на который выпущен этот сертификат. Так что не забудьте с dns отдельно разобраться, чтобы все запросы были только по доменному имени, иначе службы будут ругаться на несоответствие адреса и записи домена в сертификате. Ну и сами сертификаты надо будет указать (key, crt, bundle), по аналогии с настройками elasticsearch. Вообще, это отдельная тема, так что не хочется её сейчас рассматривать в рамках статьи по установке именно Elastic Enterprise Search. Я показываю минимально необходимые настройки, чтобы его запустить.
Квалифицированная электронная подпись для бизнеса
ВТБ — доверенное лицо Удостоверяющего центра ФНС России


Бесплатно
При наличии или открытии счета для бизнеса в ВТБ
Просто
По 2 документам и номерам ИНН, СНИЛС, ОГРН
Быстро
За 30 минут в офисе ВТБ, без посещения ФНС
Безопасно
Запись на сертифицированный USB-токен
Что такое КЭП для ИП и ООО
Квалифицированная электронная подпись (КЭП)
Это цифровой аналог собственноручной подписи индивидуального предпринимателя или руководителя юридического лица
Подходит для всех электронных сервисов
Действует 1 год и 3 месяца

Вести электронный документооборот
Подписывать договоры, обращения и другие документы в цифровом виде

Пользоваться сервисами госорганов
Работать на Госуслугах и других порталах, которые принимают квалифицированную электронную подпись

Отправлять отчетность в ФНС
Подавать отчетность и декларации в личном кабинете налогоплательщика

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

Почему стоит получить электронную подпись в ВТБ
Бесплатно выдадим КЭП на сертифицированном USB-токене
Для клиентов ВТБ при наличии или открытии расчетного счета для бизнеса

2
Оформим документы на встрече
Сотрудник банка приедет в назначенное место, или вы можете посетить ближайшее отделение банка самостоятельно
3
Бесплатно выдадим КЭП за 30 минут
Будем ждать вас в одном из доступных офисов
Оставьте заявку прямо сейчас
Оставьте номер телефона и мы проконсультируем вас в ближайшее время
1
Оставьте заявку на получение КЭП
Нужен только номер телефона
2
Позвоним и проконсультируем
3
Бесплатно выдадим КЭП за 30 минут
Будем ждать вас в одном из доступных офисов
Оставьте заявку прямо сейчас
Оставьте номер телефона и мы проконсультируем вас в ближайшее время
Документы, которые необходимо предоставить:
решение о назначении руководителя или другой документ, подтверждающий право действовать от имени юридического лица без доверенности
Номера, которые необходимо сообщить менеджеру:
ОГРН
ИНН юрлица
СНИЛС
ИНН руководителя
Документы, которые необходимо предоставить:
лист записи ЕГРИП или свидетельство ОГРНИП
Номера, которые необходимо сообщить менеджеру:
СНИЛС
ИНН
Брендированный токен банка
Рутокен ЭЦП 2.0 (сертифицированный ФСБ России)
Токен, предоставленный клиентом
JaCarta-2 ГОСТ, Рутокен ЭЦП 2.0 (новый, с заводскими настройками, сертифицированный ФСТЭК или ФСБ России)
Сборка утилиты конвертирования ключа
Далее сборка исходников описана для Linux версии.
Версию для Windows можно скачать отсюда там же есть сертификаты и закрытый ключ для тестирования, для сборки потребуется бесплатный компилятор Borland C++ 5.5
Компиляция OpenSSL библиотеки
После скачивания и распаковки исходных текстов openssl в целевой директории выполняем команды:
./config
makeПолучаем готовую библиотеку libcrypto.a в текущей директории.
Также потребуются заголовочные файлы из директорий engines/ccgost и include.
Компиляция privkey
gcc -o privkey -Iengines/ccgost -Iinclude privkey.c libcrypto.a -pthread -ldlФормирование файла закрытого ключа private. key
./privkey /mnt/usbflash/lp-9a0fe.000Тестовый закрытый ключ в криптоконтейнере lp-9a0fe.000, сертификат открытого ключа signer.cer и другие файлы для тестирования можно взять отсюда
Получаем результат работы:
-----BEGIN PRIVATE KEY-----
MEYCAQAwHAYGKoUDAgITMBIGByqFAwICJAAGByqFAwICHgEEIwIhAKzsrv/l1Uwk
uzph/LQN9mux0Jz0yaW21kOYEFv0Xyut
-----END PRIVATE KEY-----Cохраняем в private.key
Пользуемся закрытым ключом private. key для подписывания файла file. txt
openssl cms -sign -inkey private.key -in file.txt -CAfile CA.cer -signer signer.cer -engine gost -out test.sign -outform DER -noattr -binaryПроверяем подпись
openssl cms -verify -content file.txt -in test.sign -CAfile CA.cer -signer signer.cer -engine gost -inform DER -noattr -binaryВсе работает просто замечательно!
Спасибо за внимание. Это была моя первая статья на хабре.
Электронная подпись
Закон № 63-ФЗ вводит понятие электронной подписи. Раньше было понятие «электронная цифровая подпись» (ЭЦП), теперь правильнее использовать термин «электронная подпись». По этому закону есть три вида электронной подписи.
- Первый вид – это простая электронная подпись. Например, при использовании мобильного банка Вам приходит SMS с одноразовым паролем, и Вы делаете подтверждение – это аналог простой электронной подписи. По такой подписи можно определить только автора.
- Второй и третий виды – это усиленная электронная подпись. «Усиленная» означает, что используется какое-то криптосредство. Усиленная подпись делится на неквалифицированную и квалифицированную.
Усиленную квалифицированную электронную подпись иногда называют просто квалифицированной электронной подписью (КЭП). Это электронная подпись на базе сертификата, который выдается аккредитованным удостоверяющим центром. Минкомсвязь ведет список удостоверяющих центров, которые выдают сертификаты электронной подписи.
Сертификат электронной подписи (он может еще называться сертификат ключа проверки электронной подписи) – это бумажный или электронный документ, однозначно определяющий, кому принадлежит эта подпись.
Квалифицированная электронная подпись применяется наиболее широко. Ее основное назначение в том, что она подтверждает авторство, гарантирует неотказуемость и обеспечивает целостность подписанных данных. Это означает, что если Вы подписали электронный счет-фактуру квалифицированной электронной подписью, то:
- Вы не можете сказать, что это не Ваша подпись;
- Вы не можете от нее отказаться (отозвать);
- можно проверить, вносились ли изменения в этот документ после того, как Вы его подписали.
Если говорить про применение электронных подписей, то стоит поделить их на локальные и облачные.
- Локальная электронная подпись – ситуация, когда Вы подписываете какие-то документы на своем компьютере. В этом случае требуется криптосредство, установка сертификата – много сложностей.
- Облачная электронная подпись – ситуация, когда Вы доверяете хранилище закрытых ключей некоему держателю в «облаке», и, чтобы подписать документ, его нужно до этого облака донести. Скорее всего, Вам на телефон придет одноразовый пароль, который надо подтвердить. А после подтверждения электронная подпись сформируется на сервере в «облаке», и Вы получите подписанный документ.
ФСБ выпустила разъяснительное письмо, в котором объяснила, что облачная электронная подпись не является квалифицированной. Поэтому, если в законе написано, что документ должен подписываться именно квалифицированной электронной подписью, а у Вас документ подписывается в «облаке», то имейте в виду, что с этим могут быть проблемы – к этому нужно подходить очень внимательно.
Что можно еще рассказать интересного про законодательство, которое будет нас касаться?
- В 2022 году появился единый удостоверяющий центр Минкомсвязи России, который позволяет построить цепочку доверия до любого сертификата. Этот головной удостоверяющий центр Минкомсвязи, выдает сертификаты аккредитованным удостоверяющим центрам, а они уже выдают физическим и юридическим лицам. Поэтому для любой электронной подписи всегда можно построить цепочку доверия. Это очень удобно, потому что раньше было сложно проверить на практике, что подпись от другого удостоверяющего центра валидна.
- Совсем из нового – в начале 2022 года Минкомсвязь выступило с законодательной инициативой, чтобы выпуск всех квалифицированных электронных подписей отдать в государственную монополию. На это Центробанк и Минэкономразвития буквально в Июле ответили, что так делать нельзя, потому что это заберет рабочие места и погубит то, что наработано годами. Скорее всего, эта законодательная инициатива дальше не пойдет, но такая мысль была.
Трудности внедрения криптографии и эп в организациях
Какие бывают основные проблемы?
- Если Вам потребуется установить на один компьютер два криптосредства, произойдет конфликт. Например, если у Вас отчетность работает через VipNet, а электронный документооборот с контрагентами через «КриптоПро». Как решить эту проблему?
Первый вариант – разнести эти криптосредства по разным компьютерам.
Если это невозможно, тогда для одного из сервисов нужно выпустить сертификат на другом криптосредстве – когда Вы заказываете сертификат в удостоверяющем центре, Вы можете указать, для какого криптосредства Вы его будете использовать.
- Иногда у клиентов не работает криптография в браузере IE – требуется установить расширение, но оно не ставится. Банальный совет – запустите браузер от имени администратора. Это позволит установить расширение, и проблема будет решена.
- Программа 1С не всегда видит токены JaCard. Я не знаю в чем проблема, то ли в JaCard, то ли платформе. Переустанавливаешь криптосредство – оно какое-то время работает, а после перезагрузки системы снова слетает. Почему-то 1С и JaCard не очень дружат.
- Есть еще одна проблема – при проверке сертификатов платформа всегда пытается проверить, насколько этот сертификат надежный, и иногда ей это не удается. Почему это происходит? Есть список отзывов, куда включаются недействительные сертификаты. Например, когда сотрудник уволился из компании, она должна сообщить в удостоверяющий центр, что сотрудник уволился, и его сертификат не действителен. После чего удостоверяющий центр выпускает список отзывов, куда включается этот сертификат, после чего он начинает считаться невалидным. Иногда почему-то проверить сертификат в списке отозванных не удается. В чем проблема? Эти списки отзывов к 1С никакого отношения не имеют, они обновляются автоматически самим криптосредством. Для этого с удостоверяющим центром должен быть настроен стабильный канал. Если список отзывов автоматически не обновляется, это значит, что в удостоверяющем центре недостаточно слажено настроена служба, либо она вообще отсутствует. Смените удостоверяющий центр, и проблема уйдет.
- Когда сертификатов становится много (например, больше 30-ти), начинаются сложности. Допустим, Вы перевели бизнес на электронные рельсы, и в разгар рабочего дня выясняется, что подпись невалидна, потому что ее сертификат закончился. Выпуск сертификата занимает некоторое время, бизнес «на ушах», Вы тоже. Для таких случаев нужно использовать специализированное ПО для ведения списка сертификатов. Есть программы, которые позволяют контролировать жизненный цикл сертификата, и когда у него срок действия заканчивается, они отправляют администратору напоминалки. Это банальный вариант, но он позволяет более-менее упорядочить сертификаты.
- Обмен с данными из 1С происходит с серверов, поэтому:
- открываете порты на серверах 1С:Предприятия;
- права учетной записи сервера должны быть «Выход в интернет»;
- если у Вас кластер серверов, значит, у всех 1С-серверов, входящих в кластер, должны быть открыты порты.
- Если нет доверия к внешнему ресурсу, есть отдельная статья на ИТС «Диагностика проблемы “Удаленный узел не прошел проверку”».
- Базовые правила безопасности:
- пароли на стикерах не храним;
- поработав, вынимаем токены из машин;
- регулярно обновляем антивирус.
Иначе получится так, что Вы поставили сертифицированные криптосредства, ключи, а вокруг ходят вирусы, которые могут этим воспользоваться. Поэтому защищайте периметр.
На какой USB-токен можно записать КЭП?
Для записи КЭП заявитель может выбрать USB-носитель банка или предоставить собственный.
ВТБ предоставляет брендированный USB-токен Рутокен ЭЦП 2.0, сертифицированный ФСБ России. Клиентам ВТБ с открытым расчетным счетом USB-носитель для первичной записи КЭП выдается бесплатно.
От заявителей банк принимает для записи USB-токены с заводскими настройками, сертифицированные ФСТЭК России или ФСБ России: JaCarta-2 ГОСТ, Рутокен ЭЦП 2.0.
Только такие носители можно использовать для хранения ключей электронной подписи и только с ними смогут работать индивидуальные предприниматели и юридические лица.
Возможно ли оформить квалифицированную электронную подпись для главного бухгалтера или другого сотрудника?
Чтобы сотрудники организации могли подписывать документы в электронном виде, им необходимо получить квалифицированную электронную подпись физического лица и машиночитаемую доверенность, подписанную КЭП юридического лица
Добавление электронной подписи в документ pdf
Файлы PDF поддерживают внедрение в тело документа картинки с описанием, что файл PDF подписан и самой электронной подписи прямо в файл.
В платформе это реализовано начиная с версии 8.3.16. На Инфостарт есть статья на эту тему Подпись PDF в новой версии 8.3.16, но мне механизм не подошёл по ряду причин – код написан для выполнения на сервере, а при реальном использовании Крипто-ПРО ставится на клиент и вызовы должны быть соответственно на клиенте.
Грабли, на которые наступил:
* Подпись работает не для всех PDF файлов – PDF, который создан из 1С средствами 1С работает корректно, а вот PDF, сформированный другим приложением, иногда не отрабатывает.
* В качестве штампа используется Табличный документ – можно использовать вместо него картинку
* Время на добавление подписи на нормальном компьютере i7-10510U, 16Гб – 1,2 секунды, 98% времени вызов ЗаписьPDF.ЗаписатьПодпись. Есть предположение, что это время на взаимодействие с КриптоПро и концептуально его не ускорить.
Собственно сам код:
&НаКлиенте
Процедура Подписать(Команда) ПутьКФайлыПодписанный = СтрЗаменить(ПутьКФайлу, ".pdf", "_signed.pdf"); КопироватьФайл(ПутьКФайлу, ПутьКФайлыПодписанный); ДанныеСертификата = ДанныеСертификата(Сертификат); Штамп = Штамп(ДанныеСертификата.Наименование, ДанныеСертификата.ДанныеСертификата); МенеджерКриптографии = Новый МенеджерКриптографии(ДанныеСертификата.ИмяПрограммы, "", ДанныеСертификата.ТипПрограммы); МенеджерКриптографии.ПарольДоступаКЗакрытомуКлючу = Пароль; ПодписьPDF = Новый ОписаниеПодписиPDF; ПодписьPDF.Имя = "ПодписьДоговора"; ПодписьPDF.Сертификат = Новый СертификатКриптографии(ДанныеСертификата.ДанныеСертификата); ПодписьPDF.ТипПодписи = ТипПодписиPDF.Сертифицирующая; ПодписьPDF.БлокировкаДокумента = Истина; ПодписьPDF.Верх = -10; ПодписьPDF.Лево = 50; ЗаписьPDF = Новый ЗаписьPDF(); ЗаписьPDF.Открыть(ПутьКФайлыПодписанный); ЗаписьPDF.ЗаписатьПодпись(МенеджерКриптографии, ПодписьPDF, Штамп); ЗаписьPDF.Закрыть();
КонецПроцедуры
&НаСервереБезКонтекста
Функция ДанныеСертификата(Сертификат) ДанныеСертификата = Новый Структура("Наименование, ДанныеСертификата, ИмяПрограммы, ТипПрограммы"); Запрос = Новый Запрос; Запрос.УстановитьПараметр("Сертификат", Сертификат); Запрос.Текст = "ВЫБРАТЬ | Наименование, | ДанныеСертификата, | Программа.ИмяПрограммы КАК ИмяПрограммы, | Программа.ТипПрограммы КАК ТипПрограммы, | Организация.НаименованиеСокращенное КАК ОрганизацияНаименованиеСокращенное |ИЗ | Справочник.СертификатыКлючейЭлектроннойПодписиИШифрования |ГДЕ | Ссылка = &Сертификат"; Выборка = Запрос.Выполнить().Выбрать(); Если Выборка.Следующий() Тогда ЗаполнитьЗначенияСвойств(ДанныеСертификата, Выборка); ДанныеСертификата.ДанныеСертификата = Выборка.ДанныеСертификата.Получить(); ДанныеСертификата.Наименование = Выборка.ОрганизацияНаименованиеСокращенное ", " Выборка.Наименование; КонецЕсли; Возврат ДанныеСертификата;
КонецФункции
&НаСервереБезКонтекста
Функция Штамп(НаименованиеСертификата, ДанныеСертификата) Штамп = Новый ТабличныйДокумент; Сертификат = Новый СертификатКриптографии(ДанныеСертификата); Область = Штамп.Область(1, 1, 1, 1); Область.Текст = НаименованиеСертификата Символы.ПС Формат(ТекущаяДата(), "ДФ='dd.MM.yyyy HH:mm ""(MSK)""'") ", Сертификат № " СтрЗаменить(Сертификат.СерийныйНомер, " ", ""); Цвет = WebЦвета.Синий; Линия = Новый Линия(ТипЛинииЯчейкиТабличногоДокумента.Сплошная, 1); Область.ЦветТекста = Цвет; Область.ЦветРамки = Цвет; Область.ГраницаСверху = Линия; Область.ГраницаСнизу = Линия; Область.ГраницаСлева = Линия; Область.ГраницаСправа = Линия; Штамп.Область(, 1, , 1).ШиринаКолонки = 62; Штамп.Область(2,1,2,1).Текст = " "; Возврат Штамп;
КонецФункцииЧитаем закрытый ключ и конвертируем
Файл privkey.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <openssl/pem.h>
#include <openssl/cms.h>
#include <openssl/err.h>
#include "gost_lcl.h"
/* Convert little-endian byte array into bignum */
BIGNUM *reverse32bn(char *b, BN_CTX *ctx)
{ BIGNUM *res; char buf[32]; BUF_reverse(buf, b, 32); res = BN_bin2bn(buf, 32, BN_CTX_get(ctx)); OPENSSL_cleanse(buf, sizeof(buf)); return res;
}
void xor_material(char *buf36, char *buf5C, char *src)
{ int i; for(i = 0; i < 32; i++) { buf36[i] = src[i] ^ 0x36; buf5C[i] = src[i] ^ 0x5C; }
}
int make_pwd_key(char *result_key, char *start12, int start12_len, char *passw)
{ int result; int i; char pincode4[1024]; int pin_len; char current[32]; char material36[32]; char material5C[32]; char hash_result[32]; gost_hash_ctx ctx; init_gost_hash_ctx(&ctx, &GostR3411_94_CryptoProParamSet); memset(pincode4, 0, sizeof(pincode4)); pin_len = strlen(passw); if (pin_len*4 > sizeof(pincode4)) { result = 1; goto err; } for(i = 0; i < pin_len; i++) pincode4[i*4] = passw[i]; start_hash(&ctx); hash_block(&ctx, start12, start12_len); if (pin_len) hash_block(&ctx, pincode4, pin_len * 4); finish_hash(&ctx, hash_result); memcpy(current, (char*)"DENEFH028.760246785.IUEFHWUIO.EF", 32); for(i = 0; i < (pin_len?2000:2); i++) { xor_material(material36, material5C, current); start_hash(&ctx); hash_block(&ctx, material36, 32); hash_block(&ctx, hash_result, 32); hash_block(&ctx, material5C, 32); hash_block(&ctx, hash_result, 32); finish_hash(&ctx, current); } xor_material(material36, material5C, current); start_hash(&ctx); hash_block(&ctx, material36, 32); hash_block(&ctx, start12, start12_len); hash_block(&ctx, material5C, 32); if (pin_len) hash_block(&ctx, pincode4, pin_len * 4); finish_hash(&ctx, current); start_hash(&ctx); hash_block(&ctx, current, 32); finish_hash(&ctx, result_key); result = 0; //ok
err: return result;
}
BIGNUM *decode_primary_key(char *pwd_key, char *primary_key, BN_CTX *bn_ctx)
{ BIGNUM *res; char buf[32]; gost_ctx ctx; gost_init(&ctx, gost_cipher_list->sblock); gost_key(&ctx, pwd_key); gost_dec(&ctx, primary_key, buf, 4); res = reverse32bn(buf, bn_ctx); OPENSSL_cleanse(buf, sizeof(buf)); return res;
}
BIGNUM *remove_mask_and_check_public(char *oid_param_set8, BIGNUM *key_with_mask, BIGNUM *mask, char *public8, BN_CTX *ctx)
{ int result; EC_KEY *eckey = NULL; const EC_POINT *pubkey; const EC_GROUP *group; BIGNUM *X, *Y, *order, *raw_secret, *mask_inv; char outbuf[32], public_X[32]; ASN1_OBJECT *obj; int nid; order = BN_CTX_get(ctx); mask_inv = BN_CTX_get(ctx); raw_secret = BN_CTX_get(ctx); X = BN_CTX_get(ctx); Y = BN_CTX_get(ctx); if (!order || !mask_inv || !raw_secret || !X || !Y) { result = 1; goto err; } obj = ASN1_OBJECT_create(0, oid_param_set8+1, *oid_param_set8, NULL, NULL); nid = OBJ_obj2nid(obj); ASN1_OBJECT_free(obj); if (!(eckey = EC_KEY_new())) { result = 1; goto err; } if (!fill_GOST2001_params(eckey, nid)) { result = 1; goto err; } if (!(group = EC_KEY_get0_group(eckey))) { result = 1; goto err; } if (!EC_GROUP_get_order(group, order, ctx)) { result = 1; goto err; } if (!BN_mod_inverse(mask_inv, mask, order, ctx)) { result = 1; goto err; } if (!BN_mod_mul(raw_secret, key_with_mask, mask_inv, order, ctx)) { result = 1; goto err; } if (!EC_KEY_set_private_key(eckey, raw_secret)) { result = 1; goto err; } if (!gost2001_compute_public(eckey)) { result = 1; goto err; } if (!(pubkey = EC_KEY_get0_public_key(eckey))) { result = 1; goto err; } if (!EC_POINT_get_affine_coordinates_GFp(group, pubkey, X, Y, ctx)) { result = 1; goto err; } store_bignum(X, outbuf, sizeof(outbuf)); BUF_reverse(public_X, outbuf, sizeof(outbuf)); if (memcmp(public_X, public8, 8) != 0) { result = 1; goto err; } result = 0; //ok
err: if (eckey) EC_KEY_free(eckey); if (result == 0) return raw_secret; return NULL;
}
int file_length(char *fname)
{ int len; FILE *f = fopen(fname, "rb"); if (f == NULL) return -1; fseek(f, 0, SEEK_END); len = ftell(f); fclose(f); return len;
}
int read_file(char *fname, int start_pos, char *buf, int len)
{ int read_len; FILE *f = fopen(fname, "rb"); if (f == NULL) return 1; if (start_pos) fseek(f, start_pos, SEEK_SET); read_len = fread(buf, 1, len, f); fclose(f); if (read_len != len) return 1; return 0; //ok
}
int get_asn1_len(unsigned char *buf, int *size_hdr)
{ int n, i, res; int pos = 0; if ((buf[pos]&0x80) == 0) { *size_hdr = 1; return buf[pos]; } n = buf[pos++]&0x7f; res = 0; for(i = 0; i < n; i++) { res = res*256 + buf[pos++]; } *size_hdr = n+1; return res;
}
#define MAX_HEADER 20000
int read_container(char *fpath, int flag2, char *salt12, char *primary_key, char *masks_key, char *public8, char *oid_param_set8)
{ int result; char primary_path[1024+30]; char masks_path[1024+30]; char header_path[1024+30]; char header_buf[MAX_HEADER]; int header_len; int i, len, pos, size_hdr; if (strlen(fpath)>1024) { result = 1; goto err; } sprintf(header_path, "%s/header.key", fpath); if (flag2 == 0) { sprintf(primary_path, "%s/primary.key", fpath); sprintf(masks_path, "%s/masks.key", fpath); } else { sprintf(primary_path, "%s/primary2.key", fpath); sprintf(masks_path, "%s/masks2.key", fpath); } if (read_file(primary_path, 4, primary_key, 32)) { result = 1; goto err; } if (read_file(masks_path, 4, masks_key, 32)) { result = 1; goto err; } if (read_file(masks_path, 0x26, salt12, 12)) { result = 1; goto err; } header_len = file_length(header_path); if (header_len < 0x42 || header_len > MAX_HEADER) { result = 1; goto err; } if (read_file(header_path, 0, header_buf, header_len)) { result = 1; goto err; }
//------------- skip certificate --------------------------- pos = 0; for(i = 0; i < 2; i++) { get_asn1_len(header_buf+pos+1, &size_hdr); pos += size_hdr+1; if (pos > header_len-8) { result = 2; goto err; } }
//------------------ get oid_param_set8 -----------------------
#define PARAM_SET_POS 34 if (memcmp(header_buf+pos+PARAM_SET_POS, "\x6\x7", 2) != 0) { result = 2; goto err; } memcpy(oid_param_set8, header_buf+pos+PARAM_SET_POS+1, 8);
//------------------ get public8 ----------------------- result = 2; //not found pos += 52; for(i = 0; i < 3; i++) { len = get_asn1_len(header_buf+pos+1, &size_hdr); if (len == 8 && memcmp(header_buf+pos, "\x8a\x8", 2) == 0) { memcpy(public8,header_buf+pos+2,8); result = 0; //ok break; } pos += len+size_hdr+1; if (pos > header_len-8) { result = 2; goto err; } }
err: OPENSSL_cleanse(header_buf, sizeof(header_buf)); return result;
}
#define START_OID 0x12
#define START_KEY 0x28
unsigned char asn1_private_key[72] = { 0x30,0x46,2,1,0,0x30,0x1c,6,6,0x2a,0x85,3,2,2,0x13,0x30,0x12,6,7,0x11, 0x11,0x11,0x11,0x11,0x11,0x11,6,7,0x2a,0x85,3,2,2,0x1e,1,4,0x23,2,0x21,0
};
int main(int argc, char **argv)
{ int result; char *container_path; char *passw; char salt12[12]; char primary_key[32]; char masks_key[32]; char public8[8]; char oid_param_set8[8]; BN_CTX *ctx; BIGNUM *key_with_mask; BIGNUM *mask; BIGNUM *raw_key; char pwd_key[32]; char outbuf[32]; ctx = BN_CTX_new(); if (argc == 2) { container_path = argv[1]; passw = ""; } else if (argc == 3) { container_path = argv[1]; passw = argv[2]; } else { printf("get_private container_path [passw]\n"); result = 1; goto err; } if (read_container(container_path, 0, salt12, primary_key, masks_key, public8, oid_param_set8) != 0 && read_container(container_path, 1, salt12, primary_key, masks_key, public8, oid_param_set8) != 0) { printf("can not read container from %s\n", container_path); result = 2; goto err; } make_pwd_key(pwd_key, salt12, 12, passw); key_with_mask = decode_primary_key(pwd_key, primary_key, ctx); OPENSSL_cleanse(pwd_key, sizeof(pwd_key)); mask = reverse32bn(masks_key, ctx); raw_key = remove_mask_and_check_public(oid_param_set8, key_with_mask, mask, public8, ctx); if (raw_key) { BIO *bio; store_bignum(raw_key, outbuf, sizeof(outbuf)); memcpy(asn1_private_key+START_OID, oid_param_set8, 8); memcpy(asn1_private_key+START_KEY, outbuf, 32); //bio = BIO_new_file("private.key", "w"); bio = BIO_new_fp(stdout, BIO_NOCLOSE | BIO_FP_TEXT); PEM_write_bio(bio, "PRIVATE KEY", "", asn1_private_key, sizeof(asn1_private_key)); BIO_free(bio); OPENSSL_cleanse(outbuf, sizeof(outbuf)); OPENSSL_cleanse(asn1_private_key, sizeof(asn1_private_key)); result = 0; //ok } else { printf("Error check public key\n"); result = 3; }
err: BN_CTX_free(ctx); OPENSSL_cleanse(salt12, sizeof(salt12)); OPENSSL_cleanse(primary_key, sizeof(primary_key)); OPENSSL_cleanse(masks_key, sizeof(masks_key)); return result;
}Небольшой комментарий.
Основную работу выполняют следующие 3 функции:
1. Создаем ключ хранения исходя из 12-ти байтовой «соли» и пароля.
make_pwd_key(pwd_key, salt12, 12, passw);2. Расшифровываем основной ключ на ключе хранения.
key_with_mask = decode_primary_key(pwd_key, primary_key, ctx);3. Делим ключ с маской на маску.
raw_key = remove_mask_and_check_public(oid_param_set8, key_with_mask, mask, public8, ctx);Но так как в библиотеке OpenSLL операция деления по модулю традиционно отсутствует, пользуемся операцией взятия обратного числа и умножением.
if (!BN_mod_inverse(mask_inv, mask, order, ctx)) { result = 1; goto err; }
if (!BN_mod_mul(raw_secret, key_with_mask, mask_inv, order, ctx)) { result = 1; goto err; }Вопросы
Какие ты порекомендуешь удостоверяющие центры? С каким из них у тебя был положительный опыт?
Я бы порекомендовал использовать тот удостоверяющий центр, с которым Вы будете в дальнейшем работать в части обмена электронными документами. Пример – есть оператор электронного документооборота «Такском», у него есть удостоверяющий центр. Если Вы будете запускать электронный документооборот через «Такском», то имеет смысл и за сертификатом обращаться к ним же.
Ты говорил, что ФСБ давала какое-то разъяснение по поводу облачных сертификатов. Что если сертификат хранить не локально, а в облаке, он не может считаться усиленным. В случае стандартного обмена счетами-фактурами и УПД, мы можем использовать облачный сертификат или там требуется усиленный все-таки?
В законе написано, что при обмене счетами-фактурами требуется усиленная квалифицированная электронная подпись, поэтому “облако” тут не подойдет. А вот для других видов электронных документов — пожалуйста.
Грубо говоря, для любого стандартного ЭДО, которое мы используем в 1С, нам нужен усиленный сертификат?
Нет, не для любого. В законе написано только про электронные счета-фактуры. Их нужно подписывать именно квалифицированной электронной подписью. По поводу остальных документов ничего не написано. Это значит, что для накладных, для заказов Вы можете использовать усиленную неквалифицированную электронную подпись – в том числе и в облаке.
А про УПД там нет ничего? По сути, УПД сейчас это то же самое, что и счет-фактура.
Там есть размытое определение – счет-фактура с расширенными показателями, но это не то же самое, что УПД. Поэтому я думаю, что УПД попадает в разряд неквалифицированной электронной подписи.
А какую функцию во всей этой цепочке выполняет именно оператор – «1С-ЭДО» или «Такском»? Обычно через операторов мы отправляем документы в госорганы и обмениваемся счетами-фактурами, а при обмене другими документами с контрагентами зачем нам нужен оператор?
Операторы на рынке тоже не первый день работают, счета-фактуры ходят через них. Они так и говорят – отправляешь один счет-фактуру, а два другие документа – бесплатно. Вы же все равно счетами-фактурами будете обмениваться через них, поэтому проще и документы сами тоже через них посылать.
Другое дело, если Вы сидите на упрощенке, и у Вас нет счетов-фактур, тогда можно попросить оператора поискать для Вас недорогой тарифный план. А так в той же самой «Библиотеке электронных документов» есть возможность обмениваться документами с электронной подписью по электронной почте, через FTP и т.д. Но когда у тебя 100 контрагентов, организовывать для каждого из них свой канал связи будет сложно в плане сопровождения.
А если мы хотим протестить самоподписанный сертификат, через оператора мы можем тестировать какой-то обмен с использованием самоподписанного сертификата?
Нет, через оператора – нет. Если сильно хочется потестировать, напишите в фирму «1С», что Вы хотите подключиться к сервису ЭДО, чтобы протестировать.
Они говорят, что мы не удостоверяющий центр.
Напишите мне, я помогу.
А если мы обмениваемся без оператора ЭДО, мне приносят подписанный электронный документ, и я его хочу загрузить в 1С, чтобы хранить его там. В БСП достаточно средств для проверки, что это КЭП и у него правильные реквизиты, чтобы все это было в автоматическом режиме без модальных окон и т.д.?
Я такие кейсы на своей практике не встречал, но в БСП точно есть возможность загрузить файл и проверить его электронную подпись. Скорее всего, Вам надо будет просто под этот сценарий нарисовать какой-то мастер: проверь папку, забери документ, забери подпись, проверь это все, сложи, куда надо и скажи, что все ок. По поводу синхронности вызова – в БСП все это реализовано, все в браузерах работает в асинхронном режиме.
А если в 1С по терминалу работать? Можно ли поставить «КриптоПро» и в терминале пробросить для него ключи? Какие есть особенности, проблемы? И, соответственно, если у нас более 20 юрлиц и на каждое из них по два ключа, как идет разграничение прав к этим ключам? На уровне 1С или как?
В самом БСП, когда грузишь открытую часть ключа, есть возможность указать, какому пользователю она будет доступна. Там можно, войдя под своим именем, видеть только свои сертификаты. Но при этом они все будут находиться на самом компьютере. Поэтому, сами понимаете, устанавливать закрытую часть в реестр точно не нужно, потому что закрытая часть ключа без проблем переносится с машины на машину.
Лучше используйте токены. Есть возможность пробросить токен с закрытой частью ключа до терминального сервера. Ребята-производители ключей сами помогают это настроить так, чтобы в терминале этот ключ был виден. Попробуйте, поэкспериментируйте, найдите другие ключи, найдите людей, которые помогут настроить.
Но здесь нужно понимать, что этот туннель от терминального сервера до вашего ключа не безопасен. Ты генеришь электронный документ на терминальном сервере и говоришь – подпиши. Что произойдет? Идет передача данных по незащищенному каналу сначала на локальный компьютер, где установлен ключ, формируется электронная подпись, потом данные передаются обратно на терминальный сервер.
Но этот канал не защищен. Его можно защитить только с помощью установки специализированного программного обеспечения, которое делает туннель между терминальным сервером и локальной машиной безопасным. Если хочешь работать безопасно, значит, нужно поставить токен, пробросить его до терминалки и поставить ПО для шифрования канала между терминальным сервером и клиентской машиной.
Скажите, есть ли какая-нибудь разница по скорости работы между подписанием электронного счета-фактуры и отсканированного договора в 100 страниц (где чисто графика).
Чем больше документ, тем он медленнее подписывается, потому что там идет асинхронное шифрование – хэш вычисляется по асинхронному алгоритму. Но с точки зрения того, подписываете ли Вы электронную счет-фактуру в несколько строк или 10Мб файл – визуально разницу Вы не заметите. Заметите только на объемах в 1000-3000 документов.
По поводу роуминга 1С-ЭДО. В «Такском» есть роуминг между операторами. А насколько это работоспособно в «1С-ЭДО»? У Вас есть такой опыт? Потому что все контрагенты сидят на разных операторах и выбрать оператора с максимальным покрытием очень сложно. Кого бы Вы посоветовали?
Если выбирать между «1С-ЭДО» и другими, то конечно, «1С-ЭДО». Но у «1С-ЭДО» есть некоторые проблемы с роумингом – он не так много операторов поддерживает. Есть отдельный ресурс по 1С-ЭДО, там приведен список поддерживаемых операторов, думаю, что он должен со временем пополниться.
А где хранить архив подписанных документов? Локально в компании или в облаке? Можно ли обеспечить валидность сохраняемых в облаке документов?
Где мы храним подписанные документы (в облаке или нет) – неважно. Математически хэш уже вычислен, и содержимое документа бесследно уже не подменить. Вы его потом можете хоть 10 раз куда-нибудь передавать, подпись всегда можно будет проверить чисто математически. Если облачный сервис удобный – пожалуйста, храните в нем, это, наверное, даже интереснее.
А оператор такую услугу предоставляет?
Если с ним отдельный договор заключать для хранения бэкапов – они это делают за отдельные деньги.
А разве подписанные документы у них не хранятся?
Физически они хранятся, но по закону они не обязаны их хранить. Они обязаны хранить только квитанцию. Если к ним налоговая придет и спросит – проходил ли такой-то документ, они покажут, да, вот квитанция, смотрите – подпись такая-то. А что там внутри этого документа – это уже не к ним вопрос.
А для УПП операторы не предоставляют какую-нибудь обработку для ЭДО?
Про операторов не могу сказать, их много, и у каждого есть свои разработки, но в самом УПП электронный документооборот есть.
****************
Данная статья написана по итогам доклада, прочитанного на конференции INFOSTART EVENT 2022 COMMUNITY. Больше статей можно прочитать здесь.
В 2020 году приглашаем всех принять участие в 7 региональных митапах, а также юбилейной INFOSTART EVENT 2020 в Москве.
Выбрать мероприятие.
Как долго выдается КЭП ФНС?
На оформление документов и запись сертификата сотрудником банка уходит примерно 30 минут. За это время также проходит проверка данных в УЦ ФНС, как правило, она занимает несколько минут, но может потребовать больше времени, увеличив общее время выдачи
Установка Elastic Enterprise Search
Переходим к тому, зачем мы тут сегодня собрались, к установке Elastic Enterprise Search. Перед этим надо установить версию Java 8 или 11. На этом моменте я сильно завис, когда первый раз настраивал Elastic Enterprise Search. Дело в том, что в комплекте с elasticsearch уже идёт jdk. Она находится в директории – /usr/share/elasticsearch/jdk. Я пытался её подсунуть EES, чтобы не ставить еще раз java. Делал этот через объявление PATH с нужным путём в юните systemd – /usr/lib/systemd/system/enterprise-search.service. Добавлял туда:
Environment=PATH=/usr/share/elasticsearch/jdk:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
Если не добавлять вручную путь к java, то Enterprise Search ругается во время запуска:
enterprise-search[86191]: Could not find java in PATH
После добавления PATH служба запускалась и даже начинала работать, но сыпала различные ошибки и по факту не работала, только делала вид. В логе было предупреждение на несоответствие версии java, но я изначально не придавал ему значения, думая, что это формальность. И только когда установил 8 или 11 версию, все заработало.
Так что ставим openjdk 11 в систему:
# dnf install java-11-openjdk-devel
После установки java сама пропишет себя в /usr/bin/java, так что отдельно настраивать PATH для enterprise-search не придётся.
Теперь идём на страницу загрузки, скачиваем пакет под свою систему. В случае с rpm это будет следующая последовательность действий:
# wget https://artifacts.elastic.co/downloads/enterprise-search/enterprise-search-7.15.0.rpm # rpm -ivh enterprise-search-7.15.0.rpm
Перед этим пробовал установить из стандартного репозитория elastic, но оттуда почему-то предлагается к установке пакет неподходящей архитектуры.

Так что пришлось устанавливать вручную. После установки, нам надо отредактировать конфигурационный файл /usr/share/enterprise-search/config/enterprise-search.yml. Добавляем туда:
elasticsearch.username: elastic elasticsearch.password: m97KOnUDTBVAaNetJdEG allow_es_settings_modification: true kibana.external_url: http://10.30.52.6:5601
Учётетную запись elastic мы настроили в самом начале. Это она же, встроенная (built-in). И не забудьте ip для web интерфейса kibana поменять на свой. Если настроили https, то доступ должен быть по доменному имени. Запускайте и добавляйте сразу в автозагрузку службу.
# systemctl enable --now enterprise-search
Смотрим лог /var/log/enterprise-search/app-server.log. Там будет ошибка:
Invalid config file (/usr/share/enterprise-search/config/enterprise-search.yml): The setting '#/secret_management/encryption_keys' is not valid No secret management encryption keys were provided. Your secrets cannot be stored unencrypted. You can use the following generated encryption key in your config file to store new encrypted secrets: secret_management.encryption_keys: [f37a2e899b47e4749cc6c1ba01e8cfc27da9f367f0795caaed0c98e52f9dff83]
Сохраните нужную настройку и добавьте её в в конфиг enterprise-search.yml:
secret_management.encryption_keys: [f37a2e899b47e4749cc6c1ba01e8cfc27da9f367f0795caaed0c98e52f9dff83]
Снова запускайте enterprise-search:
# systemctl start enterprise-search
Теперь ошибок быть не должно. Проверьте системный лог /var/log/messages. Там будет информация о встроенной учетной записи enterprise_search. Её надо сохранить. Пригодится, если будете напрямую заходить в веб интерфейс enterprise-search, минуя Kibana.

Дождитесь, когда Elastic Enterprise Search закончит создание всех необходимых сущностей в кластере:
[2021-10-11T15:54:49.754+00:00][2355404][2002][app-server][INFO]: Creating index for Actastic::Schema: connectors_jobs_v5 [2021-10-11T15:54:49.767+00:00][2355404][2002][app-server][WARN]: Index .ent-search-actastic-connectors_jobs_v5 already exists! [2021-10-11T15:54:49.800+00:00][2355404][2002][app-server][WARN]: Going to re-create the existing empty index .ent-search-actastic-connectors_jobs_v5 [2021-10-11T15:54:55.217+00:00][2355404][2002][app-server][INFO]: Creating index for Actastic::Schema: synonyms [2021-10-11T15:54:59.473+00:00][2355404][2002][app-server][INFO]: Creating index for Actastic::Schema: document_types_v2 [2021-10-11T15:55:12.301+00:00][2355404][2002][app-server][INFO]: Creating index for Actastic::Schema: oauth_access_grants [2021-10-11T15:55:22.925+00:00][2355404][2002][app-server][INFO]: Creating index for Actastic::Schema: oauth_access_tokens [2021-10-11T15:55:40.138+00:00][2355404][2002][app-server][INFO]: Creating index for Actastic::Schema: oauth_applications_v2 [2021-10-11T15:55:49.517+00:00][2355404][2002][app-server][INFO]: Creating index for Actastic::Schema: engines_v15 [2021-10-11T15:56:05.271+00:00][2355404][2002][app-server][INFO]: Creating index for Actastic::Schema: workplace_search_accounts_v16 [2021-10-11T15:56:15.427+00:00][2355404][2002][app-server][INFO]: Creating index for Actastic::Schema: workplace_search_content_sources_v21 [2021-10-11T15:56:21.023+00:00][2355404][2002][app-server][INFO]: Creating index for Actastic::Schema: workplace_search_content_source_user_identities_v3 [2021-10-11T15:56:25.353+00:00][2355404][2002][app-server][INFO]: Creating index for Actastic::Schema: workplace_search_search_groups_v4 [2021-10-11T15:56:34.451+00:00][2355404][2002][app-server][INFO]: Creating index for Actastic::Schema: workplace_search_invitations_v2 [2021-10-11T15:56:44.807+00:00][2355404][2002][app-server][INFO]: Creating index for Actastic::Schema: workplace_search_organizations_v16 [2021-10-11T15:56:49.598+00:00][2355404][2002][app-server][INFO]: Creating index for Actastic::Schema: workplace_search_pre_content_sources [2021-10-11T15:56:58.891+00:00][2355404][2002][app-server][INFO]: Creating index for Actastic::Schema: workplace_search_role_mappings_v5 [2021-10-11T15:57:04.437+00:00][2355404][2002][app-server][INFO]: Creating index for Actastic::Schema: app_search_accounts_v9 [2021-10-11T15:57:14.853+00:00][2355404][2002][app-server][INFO]: Creating index for Actastic::Schema: app_search_api_tokens_v3 [2021-10-11T15:57:24.495+00:00][2355404][2002][app-server][INFO]: Creating index for Actastic::Schema: app_search_api_token_engines [2021-10-11T15:57:29.830+00:00][2355404][2002][app-server][INFO]: Creating index for Actastic::Schema: app_search_crawler_content_metadata [2021-10-11T15:57:41.719+00:00][2355404][2002][app-server][INFO]: Creating index for Actastic::Schema: app_search_crawler_content_url_metadata [2021-10-11T15:57:47.143+00:00][2355404][2002][app-server][INFO]: Creating index for Actastic::Schema: app_search_document_positions [2021-10-11T15:57:52.198+00:00][2355404][2002][app-server][INFO]: Creating index for Actastic::Schema: app_search_document_position_queries_v3 [2021-10-11T15:57:57.403+00:00][2355404][2002][app-server][INFO]: Creating index for Actastic::Schema: app_search_invitations_v3 [2021-10-11T15:58:01.884+00:00][2355404][2002][app-server][INFO]: Creating index for Actastic::Schema: app_search_roles_v3 [2021-10-11T15:58:07.157+00:00][2355404][2002][app-server][INFO]: Creating index for Actastic::Schema: app_search_role_engines_v3 [2021-10-11T15:58:13.895+00:00][2355404][2002][app-server][INFO]: Creating index for Actastic::Schema: app_search_search_settings [2021-10-11T15:58:19.811+00:00][2355404][2002][app-server][INFO]: Creating index for Actastic::Schema: app_search_role_mappings_v4 [2021-10-11T15:58:23.893+00:00][2355404][2002][app-server][INFO]: Creating index for Actastic::Schema: app_search_role_mapping_engines_v3 [2021-10-11T15:58:33.492+00:00][2355404][2002][app-server][INFO]: Creating index for Actastic::Schema: reindex_jobs [2021-10-11T15:58:39.493+00:00][2355404][2002][app-server][INFO]: Creating index for Actastic::Schema: secret_keeper_secrets [2021-10-11T15:58:44.220+00:00][2355404][2002][app-server][INFO]: Creating index for Actastic::Schema: crawler_domains_v4 [2021-10-11T15:58:53.884+00:00][2355404][2002][app-server][INFO]: Creating index for Actastic::Schema: crawler_crawl_requests_v4 [2021-10-11T15:59:01.565+00:00][2355404][2002][app-server][INFO]: Creating index for Actastic::Schema: crawler_process_crawls [2021-10-11T15:59:07.820+00:00][2355404][2002][app-server][INFO]: Creating index for Actastic::Schema: crawler_robots_txts_v3 [2021-10-11T15:59:11.690+00:00][2355404][2002][app-server][INFO]: Creating index for Actastic::Schema: telemetry_status_v2 [2021-10-11T15:59:16.037+00:00][2355404][2002][app-server][INFO]: Creating index for Actastic::Schema: users_v6 [2021-10-11T15:59:29.050+00:00][2355404][2002][app-server][INFO]: Saving 95 Actastic migrations [2021-10-11T15:59:29.489+00:00][2355404][2002][app-server][INFO]: [db_lock] [installation] Status: [Finished] Creating indices for 36 models [2021-10-11T15:59:29.701+00:00][2355404][2002][app-server][INFO]: Found no migrations to run [2021-10-11T15:59:29.701+00:00][2355404][2002][app-server][INFO]: Enterprise Search indices are ready [2021-10-11T15:59:29.797+00:00][2355404][2002][app-server][INFO]: [db_lock] [installation] Status: [Starting] Creating default Elasticsearch roles [2021-10-11T15:59:32.561+00:00][2355404][2002][app-server][INFO]: [db_lock] [installation] Status: [Finished] Creating default Elasticsearch roles [2021-10-11T15:59:33.081+00:00][2355404][2002][app-server][INFO]: [db_lock] [installation] Status: [Starting] Creating a default Workplace Search organization [2021-10-11T15:59:35.183+00:00][2355404][2002][app-server][INFO]: [db_lock] [installation] Status: [Finished] Creating a default Workplace Search organization [2021-10-11T15:59:35.437+00:00][2355404][2002][app-server][INFO]: [db_lock] [installation] Status: [Starting] Creating a default App Search account [2021-10-11T15:59:37.775+00:00][2355404][2002][app-server][INFO]: [db_lock] [installation] Status: [Finished] Creating a default App Search account [2021-10-11T15:59:38.051+00:00][2355404][2002][app-server][INFO]: [db_lock] [installation] Status: [Starting] Creating a default user account [2021-10-11T15:59:41.081+00:00][2355404][2002][app-server][INFO]: [db_lock] [installation] Status: [Finished] Creating a default user account [2021-10-11T15:59:41.441+00:00][2355404][2002][app-server][INFO]: [db_lock] [installation] Status: [Starting] Creating a default OAuth application [2021-10-11T15:59:42.809+00:00][2355404][2002][app-server][INFO]: [db_lock] [installation] Status: [Finished] Creating a default OAuth application [2021-10-11T16:00:49.243+00:00][2355404][2002][app-server][INFO]: Starting HTTP server... [2021-10-11T16:00:56.914+00:00][2355404][2154][app-server][INFO]: Enterprise Search version=7.15.0, JRuby version=9.2.13.0, Ruby version=2.5.7, Rails version=5.1.7 [2021-10-11T16:00:58.666+00:00][2355404][2154][app-server][INFO]: Performing pre-flight checks for Elasticsearch running on http://127.0.0.1:9200... [2021-10-11T16:00:58.962+00:00][2355404][2154][app-server][INFO]: [pre-flight] Elasticsearch cluster is ready [2021-10-11T16:00:58.965+00:00][2355404][2154][app-server][INFO]: [pre-flight] Successfully connected to Elasticsearch [2021-10-11T16:00:58.986+00:00][2355404][2154][app-server][INFO]: [pre-flight] Successfully loaded Elasticsearch plugin information for all nodes [2021-10-11T16:00:59.016+00:00][2355404][2154][app-server][INFO]: [pre-flight] Elasticsearch running with an active basic license [2021-10-11T16:00:59.068+00:00][2355404][2154][app-server][INFO]: [pre-flight] Elasticsearch API key service is enabled [2021-10-11T16:00:59.069+00:00][2355404][2154][app-server][INFO]: [pre-flight] ILM is enabled in Elasticsearch [2021-10-11T16:00:59.069+00:00][2355404][2154][app-server][INFO]: [pre-flight] Elasticsearch X-Pack security is enabled and will be used for authentication [2021-10-11T16:00:59.071+00:00][2355404][2154][app-server][INFO]: Elasticsearch looks healthy and configured correctly to run Enterprise Search [2021-10-11T16:00:59.071+00:00][2355404][2154][app-server][INFO]: Performing pre-flight checks for Kibana running on http://10.30.52.6:5601... [2021-10-11T16:01:00.177+00:00][2355404][2154][app-server][INFO]: [pre-flight] Successfully connected to Kibana [2021-10-11T16:01:01.260+00:00][2355404][2154][app-server][INFO]: Kibana looks healthy and configured correctly to run Enterprise Search [2021-10-11T16:01:03.785+00:00][2355404][2154][app-server][INFO]: Elastic APM agent is disabled [2021-10-11T16:01:19.148+00:00][2355404][2154][app-server][INFO]: ######################################################### Success! Elastic Enterprise Search is starting successfully. In a few moments, you'll be able to access Enterprise Search from Kibana at the following address: * URL: http://10.30.52.6:5601/app/enterprise_search/overview * If this is your first time starting Enterprise Search, check the console output above for your user authentication credentials. * Visit the documentation: https://www.elastic.co/guide/en/enterprise-search/7.15/index.html Secret session key has been generated. Set the key in your config file to persist user sessions through process restarts: secret_session_key: 5dd0ce292ac448979f7dc8652a610dd84e28a383f278a2b07b65154c82e460dd6917980b442e67a2f9e1dff1a80100f2e80b3d5dda5463e8e935fe8af9466af5 #########################################################

Проверьте, что служба запущена и слушает свой порт:
# netstat -tulnp | grep 3002tcp6 0 0 127.0.0.1:3002 :::* LISTEN 2355404/java
Всё в порядке. Осталось только добавить в конфиг Kibana информацию о службе:
enterpriseSearch.host: http://localhost:3002
Перезапустите Kibana и отправляйтесь в веб интерфейс, в раздел Enterprise Search.

На этом установка Elastic Enterprise Search закончена, можно начинать использовать. Напомню, что для Self-hosted решения ELK этот функционал бесплатен.
Файл masks. key
Содержит 32 байта маски ключа в формате Asn1, зашифрованного на ключе хранения pwd_key. Далее 12 байт «затравочной» информации для генерации ключа хранения pwd_key, если криптоконтейнер защищен паролем, то пароль также участвует в генерации ключа хранения.
Далее контрольная сумма (имитозащита) 4 байта. Контрольной информацией для простоты мы пользоваться не будем, общий контроль будет осуществляться путем генерации открытого ключа и сравнения первых 8 байт полученного ключа с соответствующим полем из файла header.key:

Кто может получить КЭП ФНС?
Юридическое лицо: для оформления заявки необходимо личное присутствие представителя, который имеет право действовать от имени юридического лица без доверенности.
Индивидуальный предприниматель: для оформления заявки необходимо личное присутствие индивидуального предпринимателя.
Другие категории: на данный момент ВТБ не выдает КЭП ФНС кредитным организациям, адвокатам, нотариусам, главам крестьянского хозяйства и холдингам. Получить электронную подпись они могут в рамках 63-ФЗ «Об электронной подписи»
Файл header. key
Из этого файла нам потребуется параметры электронной подписи CryptoProParamSet (подчеркнуто красным).
- GostR3410_2001_CryptoPro_A_ParamSet — 1.2.643.2.2.35.1
- GostR3410_2001_CryptoPro_B_ParamSet — 1.2.643.2.2.35.2
- GostR3410_2001_CryptoPro_C_ParamSet — 1.2.643.2.2.35.3
- GostR3410_2001_CryptoPro_XchA_ParamSet — 1.2.643.2.2.36.0
- GostR3410_2001_CryptoPro_XchB_ParamSet — 1.2.643.2.2.36.1
А также первые 8 байт открытого ключа (подчеркнуто) для контроля правильности чтения закрытого.

Заключение
Не нашёл в англоязычном интернете подробной инструкции, а тем более в русскоязычном, поэтому решил записать всю последовательность своих настроек, чтобы можно было быстро воспроизвести. Сам долго провозился из-за того, что не сразу разобрался, как всё настроить полностью на https, в том числе и все запросы между кластером и остальными. В итоге всё получилось только на валидном сертификате, но уже решил не добавлять всё это в статью, так как для работы Enterprise Search это не обязательно. Не захотелось разные темы смешивать. Возможно сделаю отдельный материал, если ещё где-то понадобится воспроизвести подобное.






