В современной корпоративной среде защита переписки становится критически важной задачей. Часто разработчики 1С сталкиваются с требованием заказчика: письмо, отправленное из системы, должно иметь официальный статус и быть подписано квалифицированной электронной подписью (КЭП). При открытии такого письма в почтовом клиенте (например, Microsoft Outlook или Thunderbird) пользователь должен видеть значок «Подписано» и иметь возможность проверить сертификат отправителя. В этой статье мы подробно разберем, почему штатные средства 1С не справляются с этой задачей и какими способами можно добиться желаемого результата.
Прежде всего, проанализируем возможности встроенного в платформу объекта ИнтернетПочта. Данный объект отлично справляется с отправкой и получением простых писем по протоколам SMTP, POP3 и IMAP. Однако, когда речь заходит о стандарте S/MIME (Secure/Multipurpose Internet Mail Extensions), мы упираемся в ограничения платформы. 1С не умеет самостоятельно упаковывать содержимое письма в формат multipart/signed и обращаться к установленным в системе криптопровайдерам (таким как КриптоПро CSP или ViPNet CSP) для генерации хеша и формирования цифровой подписи сообщения.
Разберем по шагам, какие существуют альтернативные пути реализации этой задачи, исходя из сложности внедрения и требований к инфраструктуре.
Это самый простой способ, если на рабочих местах пользователей уже установлен и настроен Microsoft Outlook. В этом случае мы перекладываем задачу формирования S/MIME-сообщения на почтовое приложение, которое «из коробки» умеет работать с сертификатами Windows.
Рассмотрим пример кода для создания подписанного письма через COM-объект:
// Создаем объект Outlook
Попытка
OutlookApp = Новый COMОбъект("Outlook.Application");
НовоеПисьмо = OutlookApp.CreateItem(0); // 0 - olMailItem
Исключение
Сообщить("Не удалось запустить Outlook. Проверьте, установлен ли он на компьютере.");
Возврат;
КонецПопытки;
// Заполняем основные реквизиты письма
НовоеПисьмо.To = "recipient@example.com";
НовоеПисьмо.Subject = "Тестовое подписанное письмо из 1С";
НовоеПисьмо.Body = "Добрый день! Это письмо подписано нашей КЭП.";
// Если в настройках Outlook указано "Подписывать исходящие сообщения",
// письмо уйдет подписанным автоматически при методе Send().
// Если нужно программно нажать кнопку "Подписать", используется работа с инспекторами:
НовоеПисьмо.Display(); // Показываем окно пользователю для визуальной проверки
Важный нюанс: для того чтобы письмо ушло подписанным, в профиле Outlook должен быть выбран соответствующий сертификат для подписи (Меню Файл -> Параметры -> Центр управления безопасностью -> Параметры центра управления безопасностью -> Защита электронной почты).
Если нам необходимо реализовать подписание на стороне сервера или мы не хотим зависеть от установленного Outlook, проанализируем использование профессиональных внешних библиотек. Одной из самых надежных является Chilkat. Она позволяет программно выбирать сертификат из хранилища и формировать S/MIME структуру без участия пользователя.
Выясним, как выглядит процесс настройки подписи через Chilkat:
// Создаем объекты компоненты
Mailman = Новый COMОбъект("Chilkat_9_5_0.MailMan");
Cert = Новый COMОбъект("Chilkat_9_5_0.Cert");
// Загружаем сертификат по его серийному номеру или e-mail
Успех = Cert.LoadByCommonName("Иванов Иван Иванович");
Если Успех <> 1 Тогда
Сообщить(Cert.LastErrorText);
Возврат;
КонецЕсли;
// Указываем компоненте использовать этот сертификат для подписи
Успех = Mailman.SetSigningCert(Cert);
// Формируем письмо
Email = Новый COMОбъект("Chilkat_9_5_0.Email");
Email.Subject = "Защищенное сообщение";
Email.Body = "Текст письма, который будет зашифрован или подписан.";
Email.AddTo("Адресат", "user@domain.com");
Email.From = "Отправитель <sender@domain.com>";
// Отправляем подписанное письмо
Успех = Mailman.SendEmail(Email);
Если Успех <> 1 Тогда
Сообщить(Mailman.LastErrorText);
КонецЕсли;
Данный метод является наиболее гибким, так как позволяет полностью автоматизировать процесс в фоновых заданиях 1С.
В случаях, когда использование платных компонент невозможно, а нам требуется поддержка российских алгоритмов ГОСТ Р 34.10-2012, мы можем использовать утилиту cryptcp, которая поставляется вместе с программным комплексом КриптоПро.
Проанализируем логику этого процесса:
ЗапуститьПриложение(), вызываем cryptcp для создания отсоединенной подписи в формате PKCS#7.smime.p7s.Пример формирования команды для подписания файла:
Команда = """C:\Program Files\Crypto Pro\CSP\cryptcp.exe"" -sign -der -cert -strict -dn ""E=mail@domain.ru"" ""C:\temp\mail_body.txt""";
ЗапуститьПриложение(Команда, , Истина); // Ожидаем завершения
Важно помнить, что даже если мы правильно сформируем подписанное письмо, получатель сможет проверить подпись только в том случае, если его почтовый клиент понимает российские криптоалгоритмы. Для Microsoft Outlook это решается установкой бесплатного плагина КриптоПро S/MIME. Без этого плагина Outlook увидит вложение smime.p7s, но выдаст ошибку о невозможности проверки подписи, так как стандартные криптопровайдеры Windows не знают ГОСТ.
Если вы решили собирать письмо вручную, разберем структуру заголовков, которую ожидает увидеть почтовый клиент:
Заголовок Content-Type должен иметь значение multipart/signed; protocol="application/x-pkcs7-signature"; micalg=gostr3411-2012; boundary="----boundary_example". Внутри сообщения первая часть — это текст письма, а вторая часть — бинарные данные подписи в кодировке Base64 с типом application/x-pkcs7-signature; name="smime.p7s".
Подведем итог: для реализации подписания писем в 1С наиболее стабильным и масштабируемым решением является использование внешних COM-библиотек (например, Chilkat) или интеграция с Outlook, если работа ведется в клиентском приложении. Использование ИнтернетПочта в данном контексте возможно только как транспорт для уже предварительно сформированного и подписанного извне MIME-сообщения.