Цифровая подпись exe, компонент и обработок для 1С: чем, когда и как проверять

· 10 мин

Содержание

Исполняемые файлы, которые вы пишете для 1С (утилиты, установщики, DLL внешних компонент), подписывают сертификатом подписи кода через signtool или PowerShell с обязательной меткой времени. Внешние обработки .epf и расширения .cfe так подписать нельзя: это не исполняемые файлы Windows. Их подлинность подтверждают регистрацией в базе, защитой от опасных действий и отдельной (отсоединённой) электронной подписью.

Что подписывают в мире 1С и обязательно ли это

Сама платформа 1С:Предприятие не требует, чтобы ваш код был подписан. Подпись нужна там, где файл запускает Windows или проверяет политика безопасности компании.

Что за файлМожно подписать AuthenticodeЧем подтверждают подлинность
📦 Установщик, своя утилита .exeДаСертификат подписи кода + signtool
⚙️ Внешняя компонента (Native API, DLL в ZIP)Да, саму DLLПодпись DLL, затем упаковка в архив
📄 Внешняя обработка или отчёт .epf / .erfНетРегистрация в базе, хеш, отсоединённая ЭП
🧩 Расширение .cfeНетБезопасный режим, профиль безопасности, контроль поставщика
📱 Мобильное приложение на 1СДа, по правилам Android и iOSКлюч подписи (keystore) или сертификат Apple
📝 Скрипт PowerShell для обслуживания базыДаSet-AuthenticodeSignature

Что говорит закон

Прямой обязанности подписывать программы для 1С закон не устанавливает. 63-ФЗ «Об электронной подписи» регулирует подпись электронных документов, а не программного кода.

На практике подпись нужна в трёх случаях:

  • 🛡️ в компании включены AppLocker или Windows Defender Application Control, и запускается только код доверенного издателя;
  • 🏛️ заказчик (банк, госорганизация) прописал подпись поставляемого ПО в договоре или техническом задании;
  • 🚫 SmartScreen и антивирусы блокируют неподписанный установщик у клиентов.

Квалифицированная подпись (КЭП) от удостоверяющего центра ФНС сделана для документов и сдачи отчётности. Для подписи кода, которую Windows проверяет «из коробки», нужен сертификат с назначением «Подписывание кода» (Code Signing). ГОСТ-подпись Windows без криптопровайдера не проверит.

Подготовка: сертификат и рабочее место для подписи

Какой сертификат выбрать

Вариантов три, они отличаются тем, кто будет доверять подписи.

СертификатКто ему доверяетКогда подходит
Коммерческий OV Code SigningВсе Windows-компьютерыТиражные продукты, установщики для клиентов
EV Code SigningВсе Windows, плюс более быстрая репутация в SmartScreenМассовое распространение
Корпоративный УЦ (AD CS, шаблон «Подписывание кода»)Только компьютеры домена, куда раздан корневой сертификатВнутренние утилиты, компоненты для своей 1С

С 2023 года закрытый ключ коммерческого сертификата подписи кода выдают только на защищённом носителе: USB-токене или в облачном HSM. Файл .pfx с ключом на диске для таких сертификатов больше не выдают.

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

Для внутреннего контура корпоративный УЦ проще всего. Администратор домена выпускает сертификат по шаблону «Подписывание кода», а через групповую политику раздаёт его в хранилище «Доверенные издатели» (Trusted Publishers) на компьютерах пользователей 1С.

Что поставить на компьютер

  1. Windows SDK, компонент «Signing Tools» — в нём signtool.exe. Обычно он лежит в C:\Program Files (x86)\Windows Kits\10\bin\<версия>\x64\.
  2. Драйвер токена, если ключ на USB-носителе.
  3. Сертификат в личном хранилище пользователя: откройте certmgr.msc → «Личное» → «Сертификаты» и проверьте, что у сертификата есть закрытый ключ.
  4. Отпечаток (thumbprint) сертификата — он понадобится в командах. Его видно на вкладке «Состав» свойств сертификата.

Как подписать exe, dll и установщик для 1С

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

Подпись через signtool

Если сертификат стоит в хранилище Windows, указывайте его по отпечатку:

signtool sign /fd SHA256 /sha1 0123456789ABCDEF0123456789ABCDEF01234567 ^
  /tr http://timestamp.digicert.com /td SHA256 ^
  /d "Утилита выгрузки из 1С" MyUtility.exe

Что значат ключи:

  • /fd SHA256 — алгоритм хеша файла. SHA-1 для новой подписи не используйте;
  • /sha1 — отпечаток сертификата из хранилища;
  • /tr и /td — сервер метки времени RFC 3161 и его алгоритм;
  • /d — описание, которое Windows покажет в окне запроса UAC.

Если ключ всё-таки лежит в файле (корпоративный УЦ, тестовый сертификат):

signtool sign /fd SHA256 /f codesign.pfx /p %PFX_PASSWORD% ^
  /tr http://timestamp.digicert.com /td SHA256 MyAddIn.dll

Не ставьте подпись без метки времени. Без неё подпись перестанет считаться действительной в день окончания срока сертификата, и все ранее выпущенные файлы придётся переподписывать. С меткой времени подпись остаётся действительной и после истечения сертификата.

Подпись через PowerShell

Удобно, когда Windows SDK ставить не хочется:

$cert = Get-ChildItem Cert:\CurrentUser\My -CodeSigningCert |
  Where-Object Thumbprint -eq '0123456789ABCDEF0123456789ABCDEF01234567'
Set-AuthenticodeSignature -FilePath .\MyUtility.exe -Certificate $cert `
  -HashAlgorithm SHA256 -TimestampServer 'http://timestamp.digicert.com'

Тем же способом подписывают скрипты обслуживания: резервное копирование базы , выгрузку .dt, очистку кэша. Если в компании политика выполнения AllSigned, неподписанный скрипт просто не запустится.

Проверка результата

signtool verify /pa /v MyUtility.exe

В PowerShell — Get-AuthenticodeSignature .\MyUtility.exe. Поле Status должно быть Valid. Для быстрой ручной проверки откройте свойства файла: вкладка «Цифровые подписи» появляется только у подписанных файлов.

Тот же приём годится для проверки дистрибутива платформы, скачанного не с официального сайта. Файлы установки 1С подписаны производителем. Если вкладки «Цифровые подписи» нет или подписант не фирма 1С, такой дистрибутив ставить нельзя.

Установщик, собранный в Inno Setup

В Inno Setup подпись настраивают один раз: в IDE через Tools → Configure Sign Tools задают команду signtool с ключами выше, а в секции [Setup] указывают директиву SignTool= с именем этой настройки. Тогда компилятор сам подпишет и установщик, и деинсталлятор.

Внешние обработки, расширения и компоненты: как подтвердить подлинность

Внешняя компонента

Внешняя компонента Native API — это ZIP-архив с DLL (и .so для Linux) и файлом MANIFEST.XML. Подписывают не архив, а каждую DLL до упаковки:

  1. Соберите DLL для x86 и x64.
  2. Подпишите обе командой signtool sign.
  3. Только после этого упакуйте их в архив вместе с манифестом.
  4. Загрузите архив в макет конфигурации или расширения.

Если в компании работает WDAC, правило по издателю пропустит вашу DLL на всех рабочих местах. Неподписанную компоненту придётся вносить в исключения по хешу и обновлять исключение после каждой сборки.

Внешние обработки и отчёты

Файл .epf — это контейнер 1С, а не исполняемый файл Windows. signtool его не примет, а платформа не проверяет у него подпись. Подлинность подтверждают средствами самой базы:

  • 🔐 Защита от опасных действий. Флажок в карточке пользователя в Конфигураторе (Администрирование → Пользователи). Пока он включён, при открытии внешнего файла из файловой системы платформа предупреждает пользователя. Снимать флажок у всех подряд не стоит.
  • 📚 Регистрация в справочнике. В типовых конфигурациях на БСП (БП 3.0, ЗУП 3.1, УТ 11) обработку загружает администратор через Администрирование → Печатные формы, отчеты и обработки → Дополнительные отчеты и обработки. Пользователь запускает уже проверенную версию из базы, а не файл с диска.
  • 🧾 Безопасный режим. При регистрации дополнительной обработки можно оставить безопасный режим. Тогда код не получит доступа к файлам, COM-объектам и внешним ресурсам без разрешений.

Если заказчик требует криптографически подтвердить, что файл пришёл от вас, используйте отсоединённую подпись — отдельный файл рядом с обработкой:

openssl cms -sign -binary -in Zagruzka.epf -signer codesign.pem -inkey codesign.key \
  -outform DER -out Zagruzka.epf.p7s

Получатель проверяет пару «файл + .p7s», а для простого контроля целостности сверяет хеш: Get-FileHash .\Zagruzka.epf -Algorithm SHA256.

В конфигурациях с подсистемой «Электронная подпись» отсоединённую подпись можно поставить и прямо в 1С: приложите файл к документу или справочнику и выполните над ним команду подписи. Нужен установленный криптопровайдер и настройки электронной подписи в разделе «Администрирование».

Расширения конфигурации

Расширение .cfe тоже не подписывают Authenticode. Его доверенность задают при подключении: флажок «Безопасный режим» и профиль безопасности в свойствах расширения. Расширение от внешнего подрядчика держите в безопасном режиме, пока не проверите код.

Мобильное приложение на мобильной платформе 1С

Сборщик мобильных приложений собирает пакет для Android и iOS, но ключи берёт у вас:

  • 🤖 Android. Нужен файл хранилища ключей. Создают его один раз:
keytool -genkeypair -v -keystore 1c-mobile.keystore -alias mobile -keyalg RSA -keysize 2048 -validity 10000

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

  • 🍏 iOS. Нужен сертификат разработчика Apple и профиль подготовки (provisioning profile). Сборка и подпись идут на компьютере с macOS.

Автоматическая подпись в CI/CD

Ручная подпись забывается на третьем релизе. В конвейере (GitLab CI, Jenkins, TeamCity) подпись делают отдельным шагом после сборки и тестов.

Типовая цепочка для проекта на 1С:

  1. Выгрузка исходников из Git, сборка обработки из XML в пакетном режиме Конфигуратора: 1cv8 DESIGNER /F <база> /LoadExternalDataProcessorOrReportFromFiles <файл.xml> <файл.epf>.
  2. Сборка C++ компоненты и утилит.
  3. Подпись DLL и exe через signtool (или osslsigncode на Linux-агенте).
  4. Упаковка компоненты в ZIP, отсоединённая подпись и хеш для .epf.
  5. Публикация артефактов вместе с файлом контрольных сумм.

Пример шага в GitLab CI на Windows-агенте:

sign:
  stage: sign
  tags: [windows, codesign]
  script:
    - signtool sign /fd SHA256 /sha1 $env:CODESIGN_THUMBPRINT /tr http://timestamp.digicert.com /td SHA256 build\*.exe build\*.dll
    - signtool verify /pa build\*.exe build\*.dll
  only:
    - tags

Как организовать доступ к ключу:

Где ключКак подписывает конвейерМинусы
USB-токен на выделенном агентеАгент с токеном получает задания с тегом codesignАгент — единая точка отказа
Облачный HSM (например, Azure Key Vault)Утилита AzureSignTool обращается к ключу по APIНужен доступ к облаку из сети сборки
Корпоративный УЦ, .pfx в хранилище секретов CIПароль и файл передают переменнымиГодится только для внутреннего контура

Пароль от .pfx и отпечаток держите в защищённых переменных CI с маскированием в логах. Подпись запускайте только для тегов релиза, а не для каждой ветки: иначе подписанные отладочные сборки разойдутся по рукам.

Ошибки проверки подписи и что с ними делать

Диагностика: выберите симптом

Частые промахи

  • 🔁 Подписали только установщик. Внутри лежат неподписанные exe и DLL, и WDAC блокирует их уже после установки. Подписывайте каждый исполняемый файл, а потом установщик.
  • 🗝️ Положили .pfx в репозиторий. Ключ из истории Git уже не удалить надёжно. Отзовите сертификат и выпустите новый.
  • 🕰️ Использовали SHA-1. Современные версии Windows такую подпись для новых файлов не считают надёжной. Только /fd SHA256.

Частые вопросы

Можно ли подписать внешнюю обработку .epf через signtool?
Нет. signtool работает с исполняемыми файлами Windows, установщиками и скриптами. Для .epf используйте регистрацию в «Дополнительных отчетах и обработках», хеш и отсоединённую подпись .p7s.
Подойдёт ли для подписи кода КЭП директора от УЦ ФНС?
Для документов и отчётности — да. Для подписи exe, которую Windows проверяет сама, — нет: нужен сертификат с назначением «Подписывание кода» от УЦ, которому доверяет Windows, или от вашего корпоративного УЦ.
Нужно ли переподписывать файлы, когда истёк сертификат?
Если при подписи ставили метку времени — нет, подпись остаётся действительной. Новым сертификатом подписывают только новые сборки.
Сколько стоит сертификат подписи кода?
Ориентировочно OV-сертификат обходится в несколько сотен долларов в год, EV — дороже, плюс токен. Сертификат корпоративного УЦ для внутренних программ бесплатен, но работает только в вашем домене.
Можно ли подписывать на Linux-сервере сборки?
Да. Утилита osslsigncode ставит Authenticode-подпись на exe и DLL под Linux, включая метку времени. Проверить результат можно той же утилитой или signtool verify на Windows.

Источники

  • Федеральный закон от 06.04.2011 № 63-ФЗ «Об электронной подписи»