Электронная цифровая подпись (ЭЦП) документов в 1С за пару кликов с использованием утилиты КРИПТО-ПРО PDF

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

    Постановка задачи в цифрах:
    • На предприятии заказчика работает почти 3000 человек в более 50 филиалах по всей России.
    • На предприятии заказчика используется УПП 1.3 (платформа 8.2.19.76).
    • Более 10 000 активных контрагентов.
    • Для большей части контрагентов (покупателей) раз в месяц нужно отправлять документы в электронном виде (Счета, акты, счета-фактуры, РТУ и т.д.). Всего, около 100 000 документов.
    • На отправку документов выделяется 2 рабочих дня.
    • В процедуре отправки должно быть задействовано минимальное количество людей. Сейчас их число удалось сократить до 2х человек.
    • Документы должны отправляться по электронной почте в виде вложенных PDF-файлов. Каждый PDF-файл должен быть подписан ЭЦП.

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

    Как всегда, решение задачи начал с изучения того, что уже есть. Нашлось несколько модулей криптографии и ЭЦП для 1С. Но они не подошли. Как правило, они умеют подписывать или XML-файлы, или сохранять подпись и открытый ключ в отдельный файл. А нам нужно было получить на выходе подписанный PDF-документ, который можно будет просто и удобно просмотреть с помощью того же Adobe Acrobat Reader.
    Вторым решением было поискать, так называемые, PDF-принтеры – программы, которые умеют сохранять любой документ в виде PDF-файла. Самым подходящим решением оказался BullZip PDF Printer (http://www.bullzip.com/products/pdf/download.php), который в платной версии имеет функцию подписания создаваемых документов. Решение, в принципе, подошло, но появились серьезные бюрократические проблемы с покупкой, согласованием и установкой нового софта на территории предприятия. Пока решение проходило согласование, я обратил внимание на комплект программ КРИПТО-ПРО, который, как правило, поставляется и работает вместе с ключом ЭЦП.

    Решение первое, полу-ручное


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

    Не буду рассматривать установку драйверов USB-ключей. Они, как правило, поставляются выпускающим удостоверяющим центром вместе с самими токенами и установка проблем не вызывает. Еще с токенами обычно поставляется лицензия на КРИПТО-ПРО и утилита КриптоПро CSP. Я использовал последнюю доступную на данный момент версию 3.9.

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

    Нажимаем Далее и получаем окошко с информацией по сертификату, к которому привязан ключ. Ждем кнопку Установить и устанавливаем сертификат в хранилище Личное для локального пользователя. Обычно, вместе с утилитой КриптоПро CSP в меню Пуск устанавливается ярлык для оснастки Сертификаты. Запускаем оснастку, убеждаемся, что все правильно сделано и сертификат действительно установился в раздел Личное для текущего пользователя.
    image

    Дальше, Кликаем правой кнопкой по установленному сертификату, Все задачи, Экспорт. Обязательно отказываемся экспортировать закрытый ключ и сохраняем сертификат куда-нибудь на локальный компьютер, например, на рабочий стол, в формате файла X.509 (.CER) в кодировке DER. Сохраненный сертификат нам понадобиться дальше для выполнения подписи.

    Последнее, что нам осталось, это скачать с сайта www.cryptopro.ru/downloads утилиту КриптоПро PDF, с помощью которой и будем выполнять подпись PDF-файлов.

    Работа утилиты крайне проста. Выбираем папку в которой находятся PDF-файлы, выбираем папку в которую будут сохранены файлы с подписью (если это одна и так же папка, в дополнительных настройках нужно установить флажок «Перезаписывать файлы с одинаковыми именами») выбираем из контейнера сертификат, который будем использовать для подписи, вводим пин от ключа и, если все указали правильно, через несколько секунд в папке-приемнике появятся подписанные PDF-файлы. Для того, чтоб ЭЦП признавалась юридически, по закону, должна быть установлена еще метка времени, но мне для задачи это не требовалось.

    В принципе, все! Если у Вас небольшая организация и пара десятков контрагентов то можно вообще ничего больше не делать и оставить все в ручном режиме. Кроме того, 1С нам пока вообще не была нужна, документы в формате PDF можно создать многими способами, в том числе и из Microsoft Office.

    Долго не мог разобраться, почему подпись не проходит и выдает ошибку. Оказалось, что успешной работы утилиты КриптоПро PDF на компьютере должна быть установлен Adobe Acrobat Pro (не Reader, это важно!). Именно с его помощью утилита модифицирует PDF-файлы и добавляет и них подпись.

    Пример подписанного файла на картинке. Выглядит как обычный PDF, только на закладке Подписи появились данные о подписанте. Из важного, указано кто подписал документы (обычно это ФИО и название организации) и что с момента подписания документ не изменялся. Информацию о том, что сертификат ненадежный можно игнорировать. Это говорит только о том, что компания Adobe и ее продукт Acrobat Reader ничего не знают о Вашем сертификате.
    image

    Решение второе, автоматическое


    Как писал выше, в моем случае ручное решение не подошло. Контрагентов много, для каждого за месяц создается несколько десятков документов. Их все нужно сохранить в PDF, подписать, отправить одним письмом. Для решения задачи придумали модифицировать и использовать стандартную для многих конфигураций обработку «Групповая обработка справочников и документов». Для самых популярных конфигураций эта обработка или входит в саму конфигурацию или ее можно найти как внешнюю на диске с ИТС.

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

    Немного доработали интерфейсную часть. Убрали из обработки работу со справочниками. Оставили в интерфейсе 4 вида документов, которые нужно отправлять. Изменили систему отборов. Создали новый регистр сведений Настройки ЭЦП. В него для каждого пользователя сохраняется информация о том, по какому пути лежит КриптоПро PDF на локальном компьютере, папки для временного хранения файлов, сертификат, которым будет выполнена подпись. Еще просили сохранять пин от ключа, но мы не стали этого делать из соображений безопасности.

    Чтоб автоматизация была уж совсем полной, пришлось в 1С оживить модуль электронной почты. Дальше все просто. Раз в месяц оператор выбирает список контрагентов и виды документов, которые должны быть отправлены, проверяет результат отбора, нажимает кнопку Выполнить, вводит пин-код от ключа и ждет… В моем случае формирование пакета документов может длится несколько часов.

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

    Для удобства приведу кусочек кода, который выполняет саму процедуру подписания. Все параметры берутся из созданного регистра сведений.

    	МассивВходящих = НайтиФайлы(КаталогВходящие, "*.pdf", Ложь);
    	КоличествоФайловВходящие = МассивВходящих.Количество();
    	Сообщить("Обнаружено " + КоличествоФайловВходящие + " файлов для подписи.");
    	
    	КоманднаяСтрока = ИмяФайлаКриптоПро + " sign" +
    	" --in-dir=""" + КаталогВходящие + """" +
    	" --out-dir=""" + КаталогИсходящие + """" +
    	" --report-dir=""" + КаталогЛоги + """" +
    	" --err-dir=""" + КаталогОшибки + """" +
    	" --certificate=""" + ИмяФайлаСертификата + """" +
    	" --pin=""" + ПинКод + """" +
    	" --overwrite-files";
    	
    	ЗапуститьПриложение(КоманднаяСтрока, "", истина);
    	
    	МассивИсходящих = НайтиФайлы(КаталогИсходящие, "*.pdf", Ложь);
    	КоличествоФайловИсходящие = МассивИсходящих.Количество();
    	Сообщить("Подписано " + КоличествоФайловИсходящие + " файлов.");
    
    Поделиться публикацией

    Комментарии 20

      0
      А как потом проверить валидность подписи? Тоже ставить платный КРИПТО-ПРО?
        +1
        Только что проверил у себя на домашнем компьютере, где не стоит КРИПТО-ПРО. Акробат сначала поругался, что не может проверить, полез в Интернет, доставил плагин безопасности и смог провалидировать подпись. А до валидации он говорил, что проверить не может, но показывал информацию о подписанте.
          0
          Это как он проверил ГОСТ-подпись?
            0
            Видимо плагин к акробату сам умеет это делать. КРИПТО-ПРО у меня точно не стоит. И в акробате есть кнопка проверки подписи.
              0
              В плагине акробата реализован ГОСТ Р 34.10-2001?
          0
          Все продукты КРИПТО-ПРО не требуют лицензию для проверки электронной подписи.
          0
          Adobe Acrobat XI Professional от 16 до 31 тысячи
            0
            Да, весь перечисленный софт платный. Но имеет триальные версии, на которых этот механизм и тестировался.
              0
              Дело в том, что после того как Ростелеком отказался от выдачи электронных подписей их можно получить в мутных конторах паразитирующих на торгах и как следствие цена для человека получается 1000-2000 рублей без токена. Подпись на год соответственно каждый год такая же сумма. А если захочется использовать подпись, то будь добр доплати за акробат про и крипто про вроде не бесплатный.
                0
                Смотря какая подпись. Если нужна усиленная неквалифицированная, то она может стоить 0 руб. Но нужно создать четкий регламент ее арбитража и заставить его подписать всех участников системы. И потом считать накладные расходы. В итоге может получиться, что дешевле купить квалифицированную подпись в УЦ.
                  0
                  Мне решительно непонятно в чём разумный смысл разведения такого количества отдельных подписей под разные торги (кроме жажды наживы), а так же ограничение в год для подписи физ. лицам. Оптимальной была бы квалифицированная подпись подписываемая в МФУ за пару минут и 50 рублей. Лучше на несколько лет.

                  Всё это создаёт дополнительные трудности для организаций и трудности для электронной работы фирм с физ. лицами.
                    0
                    Для разного типа подписей при получении запрашиваются разные комплекты документов. Чем «квалифицированнее» подпись тем больше документов проверяют и тем она дороже. А еще в эту сумму обычно входит стоимость самого токена и лицензии на КРИПТО-ПРО.
                      0
                      Ну какая разница от количества документов и справок, если подпись генерируется программой, или переложить бумажки из одной стопки в другую настолько тяжелый труд? Основное назначение подписи идентификация подписанта, а это: ФИО, дата и место рождения, место прописки, должность и место работы (опционально).
                        0
                        Не совсем так. Сейчас каждый документа проверяется в соответствующей государственной службе. Как раз на другом проекте сейчас автоматизирую проверку данных подписанта через сервер СМЭВ. Чтоб не бумажки перекладывать а через SOAP-сервис все запрашивать из ФНС, ПФР, ЭГРЮЛ и т.п… Плюс, выдача ЭЦП как-то регламентирована государством. Я не сильно задавался вопросом ценообразования, но, если интересно, могу разузнать подробнее.
                  –1
                  Даже для компании, которая на рынке беляшами торгует, 2000р в год — не критичная сумма. В эту сумму часто входит право на использование КриптоПро (не отдельная пожизненная лицензия, а на год — встроенная в подпись). AcrobatPro — не обязателен:
                  В Adobe Reader возможно создание подписей только для файлов PDF с включенными для Reader правами использования (в Adobe Acrobat: «Дополнительно» — «Расширить функции Adobe Reader»
                    +1
                    Прям так и 2000 руб.
                    На одну площадку покупаем один сертификат, но выясняется, что на другой его не принимают. А для сдачи отчетности оказывается нужен 3-ий сертификат. И не за 2000 руб, а дороже.
                    Нет единого пространства доверия, страдают пользователи.
              +1
              Прошу прощения, немного пиара.
              Библиотека iText поддерживает создание ГОСТ-подписи на .NET и JAVA — Acrobat покупать не обязательно. Пример входит в КриптоПро .NET SDK.
              А для разовой подписи будет удобно воспользоваться сервисом DSS Lite — сейчас доступна альфа версия
                0
                Клиенты предварительно устанавливают ваш сертификат с открытым ключом, чтобы доверять вашей подписи, или для чего все это?
                  0
                  В данном случае задачи шифровать не стояло, поэтому все происходит автоматически. В подписи есть ссылка на открытый ключ, который хранится в удостоверяющем центре, выпустившем сертификат. Т.е. подпись может проверить любой получатель документа.
                  0
                  По доброй традиции хаба «Клиентская оптимизация» поинтересуюсь:
                  — автор, вам известно значение термина, давшего название упомянутому хабу?
                  — какое отношение этот топик имеет к предметной области, описываемой этим термином?

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

                  Самое читаемое