Цифровая подпись exe, компонент и обработок для 1С: чем, когда и как проверять
Содержание
Исполняемые файлы, которые вы пишете для 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С.
Что поставить на компьютер
- Windows SDK, компонент «Signing Tools» — в нём
signtool.exe. Обычно он лежит вC:\Program Files (x86)\Windows Kits\10\bin\<версия>\x64\. - Драйвер токена, если ключ на USB-носителе.
- Сертификат в личном хранилище пользователя: откройте
certmgr.msc→ «Личное» → «Сертификаты» и проверьте, что у сертификата есть закрытый ключ. - Отпечаток (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 до упаковки:
- Соберите DLL для x86 и x64.
- Подпишите обе командой
signtool sign. - Только после этого упакуйте их в архив вместе с манифестом.
- Загрузите архив в макет конфигурации или расширения.
Если в компании работает 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С:
- Выгрузка исходников из Git, сборка обработки из XML в пакетном режиме Конфигуратора:
1cv8 DESIGNER /F <база> /LoadExternalDataProcessorOrReportFromFiles <файл.xml> <файл.epf>. - Сборка C++ компоненты и утилит.
- Подпись DLL и exe через
signtool(илиosslsigncodeна Linux-агенте). - Упаковка компоненты в ZIP, отсоединённая подпись и хеш для
.epf. - Публикация артефактов вместе с файлом контрольных сумм.
Пример шага в 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?
Подойдёт ли для подписи кода КЭП директора от УЦ ФНС?
Нужно ли переподписывать файлы, когда истёк сертификат?
Сколько стоит сертификат подписи кода?
Можно ли подписывать на Linux-сервере сборки?
Источники
- Федеральный закон от 06.04.2011 № 63-ФЗ «Об электронной подписи»