- Рассылка документа электронной почтой нескольким адресатам¶
- 2. Создание и проверка ЭП
- 4.2 Добавление подписи в строку подписания
- 4.3 Просмотр свойств подписи
- Firefox – как сделать цифровой сертификат доступным для libreoffice writer для цифровых подписей?
- Writer¶
- Диалог параметры pdf. вкладка общие¶
- Диалог параметры pdf. пользовательский интерфейс¶
- Печать брошюр¶
- Печать чёрно-белым (на цветном принтере)¶
- Электронная подпись гост р 34.10 документов формата pdf в офисном пакете libreoffice
Рассылка документа электронной почтой нескольким адресатам¶
Чтобы отправить документ нескольким получателям по электронной почте, можно использовать соответствующие функции в программе электронной почты или можно использовать средства почтовой рассылки LibreOffice для извлечения адресов электронной почты из адресной книги.
Использовать LibreOffice для почтовой рассылки можно двумя путями:
- Использовать мастер Письмо. для создания документа и его отправки. Смотрите Главу 11 — Использование почтовой рассылки в Руководстве по Writer для получения более подробной информации.
- Создать документ в Writer без использования мастера, а затем отправить его с помощью мастера. Этот метод описан ниже.
Чтобы использовать Мастер рассылки писем для отправки предварительно созданного документа:
- Выберите пункт меню Сервис ‣ Рассылка писем. . На первом шаге мастера выберите вариант Использовать текущий документ и нажмите на кнопку Далее.
Мастер рассылки писем. Шаг 1. Выбор документа
Мастер рассылки писем. Шаг 2. Выбор типа документа
- На третьем шаге мастера нажмите на кнопку Выбрать список адресатов. Выберите необходимый список адресов (даже, если он только один) и нажмите кнопку ОК. (Если нужный список адресов здесь не показан, можно нажать кнопку Добавить, чтобы найти его и добавить в список). Нажмите кнопку Далее.
Мастер рассылки писем. Шаг 3. Выбор списка адресов
Отмена создания приветствия
- В списке шагов слева выберите Шаг 8. Сохранение, Печать или Отправка. LibreOffice отобразит сообщение «Создание документа», а затем страницу мастера.
- Выберите вариант Отправить письма по электронной почте. Нижняя часть страницы изменится и покажет настройки выбора электронной почты.
- Введите тему письма и нажмите кнопку Отправить документы. LibreOffice отправит электронную почту.
Отправка документа по электронной почте
2. Создание и проверка ЭП
После завершения редактирования документа и сохранения документа можно добавить к документу ЭП.
Подписанный документ будет доступен только для чтения.
Если в подписанный документ нужно внести изменения, то все созданные ЭП следует удалить из документа.
Для создания ЭП в MS Office Word 2007 или Excel 2007:
В главном меню выберите пункт Подготовить, затем Добавить цифровую подпись (КРИПТО-ПРО)
Для создания ЭП в MS Office Word 2022 или Excel 2022:
На вкладке Файл в разделе Сведения нажмите кнопку Добавить цифровую подпись (КРИПТО-ПРО)
Затем появится окно подписания документа. Это окно позволяет пользователю указать свой личный сертификат, который будет использоваться для формирования ЭП. Один из сертификатов будет выбран автоматически.
Если нужно выбрать другой сертификат — нажмите кнопку Изменить. В появившемся окне представлен список сертификатов пользователя, установленных на компьютере.
Выберите сертификат и нажмите ОК. Если для доступа к ключевому контейнеру требуется задать пароль — появится окно ввода пароля.
Если пароль введен неверно, повторите попытку. При успешном вводе пароля появится окно о статусе подписания документа.
После подписи документа, в строке состояния окна документа появится значок, свидетельствующий о том, что данный документ имеет ЭП.
Для проверки статуса подписи, нажмите на этот значок, и справа появится вкладка Подписи, в которой указан статус подписи. Для просмотра состава подписи щелкните правой кнопкой мыши на строке подписи и выберите пункт Состав подписи.
Появится более детальное сообщение о составе подписи.
При открытии измененного документа, содержащего ЭП, появится сообщение о том, что документ содержит недействительную подпись.
Для более детального просмотра статуса, нажмите на значок ЭП в строке состояния, и справа появится окно, содержащее недействительный статус подписи.
Состав подписи можно посмотреть нажатием правой кнопки мышки
4.2 Добавление подписи в строку подписания
Дважды щелкните мышью в документе по строке подписи, в которую требуется ввести подпись. Появится диалоговое окно Подписание
В верхней части окна можно просмотреть дополнительные сведения о создаваемой подписи нажав ссылку Дополнительные сведения о том, что подписывается.
При нажатии ссылки Выбрать рисунок можно добавить изображение, например, своей рукописной подписи.
Один из имеющихся на компьютере сертификатов будет выбран автоматически.
Для выбора другого цифрового сертификата для подписи нажмите кнопку Изменить и в окне Выбор сертификата выберите необходимый сертификат
В окне Подписание нажмите кнопку Подписать. Появится информационное окно подтверждения подписи, в этом окне нажмите кнопку ОК. Для удобства работы можно установить флажок Больше не показывать это сообщение.
Созданная подпись будет отображена в документе. Одновременно будет отображена вкладка Подписи, в которой приведен список подписей в документе. Созданная подпись будет находиться в разделе Действительные подписи. Незаполненная подпись — в разделе Требуемые подписи.
После того, как в документе появилась первая (или единственная) цифровая подпись, он автоматически помечается как окончательный и доступен только для чтения.
Если документ содержит единственную подпись, то на этом работа с ним заканчивается.
Если документ содержит несколько строк подписей для нескольких лиц, документ следует передать этим лицам для подписания.
При открытии документа, содержащего незаполненные строки подписи, появляется панель сообщений.
Щелкните по кнопке Просмотр подписей, после чего на вкладке Подписи будет отображен список подписей в документе.
Для добавления подписи в строку подписи дважды щелкните по строке подписи в тексте документа или в панели Подписи нажмите правой кнопкой мыши на нужной строке подписи и выберите команду Подписать.
В окне Подписание введите необходимую информацию и нажмите кнопку Подписать
После создания последней подписи в документе в панели Подписи все подписи будут находиться в разделе Действительные подписи
4.3 Просмотр свойств подписи
В окне документа в панели Подписи щелкните по стрелке требуемой подписи и выберите команду Состав подписи. Можно также дважды щелкнуть мышью по строке подписи в тексте документа.
Свойства подписи буду отображены в соответствующем окне. Для просмотра сертификата, использовавшегося при создании подписи, нажмите кнопку Просмотр.
Подписанный документ, можно просматривать, печатать, выделять фрагменты и копировать их в буфер обмена.
Можно скопировать и строку подписи в другой документ, но эта строка подписи вставляется без цифровой подписи. Необходимо добавление подписи в строку подписи в новом документе.
При попытке сохранить подписанный документ под другим именем, появляется информационное окно:
Если нажать кнопку Да, все подписи в документе станут недействительными.
Документ, содержащий цифровые подписи, автоматически помечается как окончательный. При попытке снятия этой отметки появляется информационное окно.
Если нажать кнопку Да, то любое действие по редактированию документа приведёт к тому, что все подписи в документе станут недействительными.
Тогда в строках подписи появится текст Недействительная подпись. На вкладке Подписи данные подписи будут находиться в разделе Недействительные подписи.
Документ, содержащий недействительную подпись, можно подписать повторно.
Для этого на вкладке Подписи щелкните по стрелке недействительной подписи и выберите команду Подписать еще раз. Можно также щелкнуть правой кнопкой мыши по строке подписи в тексте документа и в контекстном меню выбрать команду Подписать еще раз.
Заново заполните окно Подписание и нажмите кнопку Подписать.
Firefox – как сделать цифровой сертификат доступным для libreoffice writer для цифровых подписей?
Часть первая: В Firefox создайте резервную копию сертификата в виде файла .p12.
В Firefox, щелкните Edit> Preferences, чтобы отобразить настройки
диалог.
В диалоговом окне «Настройки» нажмите кнопку «Дополнительно».
В форме «Дополнительно» нажмите кнопку «Просмотр сертификатов», чтобы
отобразить диалоговое окно диспетчера сертификатов.
В диалоговом окне диспетчера сертификатов щелкните вкладку «Ваши сертификаты».
Разверните имя соответствующего центра сертификации и щелкните значок
соответствующий сертификат, чтобы выбрать его.
Нажмите кнопку «Резервное копирование», чтобы отобразить диалоговое окно «Сохранить как» с заголовком «Имя файла».
для резервного копирования.
В диалоговом окне “Имя файла для резервного копирования” в текстовом поле “Имя” введите
имя, которое вы хотите присвоить резервной копии файла.
Выберите папку, в которой вы хотите сохранить файл.
Нажмите кнопку Сохранить, чтобы отобразить Выбор резервной копии сертификата
Диалоговое окно пароля.
Дважды введите выбранный пароль. Щелкните кнопку ОК.
Появится диалоговое окно с предупреждением о том, что ваши сертификаты
и закрытые ключи были успешно скопированы. Щелкните кнопку ОК.
Закройте два других открытых диалоговых окна.
Часть 2: С помощью Thunderbird импортируйте файл .p12 в хранилище сертификатов Thunderbirds.
В Thunderbird нажмите «Правка»> «Настройки», чтобы открыть диалоговое окно «Настройки Thunderbird».
Нажмите кнопку «Дополнительно» в верхнем меню.
В форме «Дополнительно» щелкните вкладку «Сертификаты».
Нажмите кнопку «Просмотр сертификатов», чтобы отобразить диалоговое окно «Диспетчер сертификатов».
Щелкните вкладку «Ваши сертификаты».
Нажмите кнопку «Импорт», чтобы открыть диалоговое окно «Сертификаты для импорта».
Найдите файл .p12, который вы создали. в Firefox щелкните его и нажмите кнопку «Открыть», чтобы отобразить диалоговое окно ввода пароля.
Введите пароль, который вы использовали для резервного копирования файла из Firefox, и нажмите кнопку «ОК».
Появится диалоговое окно с предупреждением, указывающее, что операция успешно.
Закройте два других открытых диалоговых окна.
Часть 3: В Thunderbird отредактируйте корневой сертификат вашего центра сертификации, чтобы сделать его надежным для идентификации веб-сайтов, пользователей почты и производителей программного обеспечения.
Часть 4: ] В LibreOffice Writer убедитесь, что сертификат доступен для цифровых подписей.
Ваш сертификат появится в списке сертификатов.
Writer¶
Нормальный вид страницы в Writer показывает как будет выглядеть каждая страница при печати; в этом представлении можно редактировать страницы. Если вы готовите документ, который будет печататься на обеих сторонах листов бумаги (книга или брошюра), то можно увидеть, как выглядит книжный разворот. В Writer есть два способа сделать это:
- Вид макета (можно редактировать): используйте кнопку Предварительный просмотр книжного разворота в строке состояния.
Режим отображения страниц
Чтобы использовать Предварительный просмотр страницы:
- Выберите пункт меню Файл ‣ Предварительный просмотр страницы , или нажмите на значок Предварительный просмотр страницы () на стандартной панели инструментов, или нажмите сочетание клавиш Ctrl Shift O . В Writer вместо панели инструментов Форматирование будет показана панель инструментов Предварительный просмотр страницы.
Панель инструментов Предварительный просмотр страницы (Writer)
- Выберите нужный значок предварительного просмотра: Две страницы (), Несколько страниц () или Предварительный просмотр книги ().
- Чтобы распечатать документ из этого режима, нажмите значок Печать документа (), чтобы открыть диалог Печать. Выберите настройки печати и нажмите кнопку OK.
Для предварительного просмотра листов Calc перед печатью:
- Выберите пункт меню Файл ‣ Предварительный просмотр страницы .
Панель инструментов Предварительный просмотр страницы (Calc)
- Чтобы распечатать документ из этого режима, нажмите значок Печать документа (), чтобы открыть диалог Печать.
- Выберите настройки печати и нажмите кнопку OK.
Диалог параметры pdf. вкладка общие¶
На вкладке Общие, можно выбрать, какие страницы включать в PDF, тип сжатия для использованных изображений (что влияет на качество изображений в PDF) и другие параметры.
На вкладке Общие, можно выбрать, какие страницы включать в PDF, тип сжатия для использованных изображений (что влияет на качество изображений в PDF) и другие параметры.
Диалог Параметры PDF. Вкладка Общие
Раздел Диапазон
- Все: Экспорт всего документа в PDF.
- Страницы: Чтобы экспортировать диапазон страниц, используйте формат 3-6 (страницы с 3 по 6). Чтобы экспортировать отдельные страницы, используйте формат 7, 9, 11 (страницы 7, 9 и 11). Также можно экспортировать комбинацию диапазонов и отдельных страниц, используя следующий формат: 3-6, 8, 10, 12.
- Выделенное: Экспорт всего выделенного материала.
Раздел Изображения
- Сжатие без потерь: Изображения при экспорте сохраняются без потери качества. Имеет тенденцию создавать большие файлы при использовании в документе фотографий. Рекомендуется для других видов изображений или графики.
- Сжатие JPEG: Позволяет устанавливать различные степени качества. Установка качества на 90% хорошо работает с фотографиями (небольшой размер файла, незаметные потери качества).
- Уменьшить разрешение: Снижение значения DPI (точек на дюйм) вызовет понижение качества изображения. Для просмотра на экране компьютера, как правило, достаточно разрешения 96 dpi (для Windows или GNU/Linux), в то время как для печати предпочтительнее использовать по крайней мере 300 или 600dpi, в зависимости от возможностей принтера. Более высокие значения DPI значительно увеличивают размер экспортируемого файла.
Диалог параметры pdf. пользовательский интерфейс¶
На вкладке Пользовательский интерфейс можно выбрать другие параметры для управления программой для просмотра PDF при открытии файла. Некоторые из этих параметров особенно полезны при создании PDF для использования в качестве презентации или отображения в «киосках».
Диалог параметры PDF. Вкладка Пользовательский интерфейс
Раздел Свойства окна
- Изменить размер окна по начальной странице. Заставляет окно просмотра PDF изменить размеры так, чтобы соответствовать первой странице PDF файла.
- По центру экрана. Заставляет окно просмотра PDF открываться по центру экрана.
- Открыть в полноэкранном режиме. Заставляет окно просмотра PDF разворачиваться при открытии файла на полный экран.
- Показать заголовок документа. Заставляет программу для просмотра PDF отображать заголовок документа в заголовке окна.
Раздел Свойства пользовательского интерфейса
- Скрыть панель меню. Заставляет программу для просмотра PDF скрывать панель меню.
- Скрыть панель инструментов. Заставляет программу для просмотра PDF скрывать панель инструментов.
- Скрыть элементы управления окном. Заставляет программу для просмотра PDF скрывать элементы управления окном.
Раздел Переходы
Для Impress: отображать эффекты перехода слайдов, как соответствующие эффекты PDF.
Раздел Закладки
Выберите количество уровней заголовков, отображаемых в виде закладок, при выборе опции Экспортировать закладки на вкладке Общие.
Печать брошюр¶
В Writer, Impress и Draw можно распечатать документ в режиме двух страниц на каждой стороне листа бумаги, расположенных в таком порядке, что после сгиба напечатанных страниц по середине и размещения их в нужном порядке, они сформируют буклет или брошюру.
Планируйте документ так, чтобы он хорошо выглядел при печати в половинном размере. Выберите соответствующие поля, размер шрифта и прочие параметры. Скорее всего, нужно будет немного поэкспериментировать.
Чтобы напечатать брошюру на принтере без встроенной функции двухсторонней печати:
- Выберите пункт меню Файл ‣ Печать или нажмите сочетание клавиш Ctrl P .
- В диалоге Печать, на вкладке Общие, нажмите кнопку Свойства.
- Проверьте настройки принтера: ориентация (книжная или альбомная) должна совпадать с настройками страницы в документе. Обычно ориентация не имеет значения, но в данном случае, для печати брошюр, это важно. Нажмите кнопку ОК, чтобы вернуться к диалогу Печать.
- Выберите вкладку Макет страницы.
- Выберите вариант Брошюра в разделе Разметка.
- В разделе Страницы выберите из выпадающего списка Оборотные стороны/левые страницы.
- Нажмите кнопку OK.
- Возьмите распечатанные страницы из принтера, переверните страницы и положите их обратно в принтер в правильном положении для печати на чистой стороне. Возможно, придется немного поэкспериментировать, чтобы выяснить, какое положение бумаги в этом случае для вашего принтера правильное. Для этого ограничьте количество страниц для печати хотя бы до 9.
- В диалоге Печать, на вкладке Макет страницы, в разделе Страницы выберите из выпадающего списка Лицевые стороны/правые страницы.
- Нажмите кнопку OK.
Если принтер поддерживает автоматическую двухстороннюю печать, то выбирайте из выпадающего списка вариант Все страницы.
Печать чёрно-белым (на цветном принтере)¶
Можно распечатывать документы в черно-белом варианте на цветном принтере. Доступно несколько вариантов настройки. Пожалуйста, обратите внимание на то, что некоторые цветные принтеры будут печатать в цвете, независимо от выбранных настроек в LibreOffice.
Измените настройки принтера для печати чёрно-белым или оттенками серого:
- Выберите пункт меню Файл ‣ Печать. или нажмите сочетание клавиш Ctrl P .
- На вкладке Общие нажмите кнопку Свойства, чтобы открыть диалог настроек принтера. Доступные варианты зависят от модели принтера, но там должны быть варианты для настройки цвета. Смотрите справку или руководство пользователя принтера для получения дополнительной информации.
- Выбор цветовых настроек может включать в себя варианты черно-белый или оттенки серого. Выберите нужный.
- Нажмите кнопку OK, чтобы подтвердить выбор и вернуться к диалогу Печать.
- Нажмите кнопку OK, чтобы распечатать документ.
Оттенки серого – лучший выбор, если у вас есть какие-то графические объекты в документе. Чёрно-белая печать подходит для отсканированных изображений, содержащих только текст.
Измените настройки LibreOffice, чтобы печатать весь цветной текст и графические объекты оттенками серого:
- Выберите пункт меню Сервис ‣ Параметры ‣ LibreOffice ‣ Печать .
- Отметьте галочкой пункт Преобразовать цвета в оттенки серого. Нажмите кнопку OK, чтобы записать изменения.
- Откройте диалог Печать, выбрав пункт меню Файл ‣ Печать. или нажав сочетание клавиш Ctrl P .
- Нажмите кнопку OK, чтобы распечатать документ.
Измените настройки LibreOffice Writer (или Calc, Impress, Draw), чтобы печатать весь цветной текст чёрным цветом, а все графические объекты оттенками серого:
- Выберите пункт меню Сервис ‣ Параметры ‣ LibreOffice Writer ‣ Печать .
- В разделе Содержимое отметьте галочкой пункт Печатать текст чёрным. Нажмите кнопку OK, чтобы сохранить изменения.
- Откройте диалог печать, выбрав пункт меню Файл ‣ Печать или нажав сочетание клавиш Ctrl P .
- Нажмите кнопку OK, чтобы распечатать документ.
Электронная подпись гост р 34.10 документов формата pdf в офисном пакете libreoffice
Пришла пора исполнить свой гражданский долг – заплатить налоги. Платить налоги мы будем через портал Госуслуги. В личный кабинет портала Госуслуг будем входить с помощью электронной подписи (терминология портала Госуслуг ), т.е. имея на руках сертификат, полученный в аккредитованном удостоверяющем центре (УЦ), и закрытый ключ. И то и другое я храню на токене PKCS#11 с поддержкой российской криптографии:
И вот, выполнив свой гражданский долг, я решил еще раз проверить работу электронной подписи в офисном пакете libreoffice.
Почему я решил это сделать? Для доступа к порталу Госуслуг я использую ОС Linux и браузер Redfox, который представляет собой доработанный с учетом поддержки российской криптографии браузер Mozilla Firefox. Как известно, офисный пакет libreoffice в качестве хранилища сертификатов также использует хранилище NSS.
Браузер Redfox-52 был установлен в папку /usr/lical/lib64/firefox-52.
Для подключения библиотек пакета NSS (Network Security Services) с поддержкой ГОСТ-алгоритмов устанавливаем значение переменной LD_LIBRARY_PATH следующим образом:
$export LD_LIBRARY_PATH=/usr/lical/lib64/firefox-52:$LD_LIBRARY_PATH
$
В качестве хранилища сертификатов в libreoffice как правило используется хранилище сертификатов из браузера Firefox, почтового клиента Thunderbird или интегрированного пакета Seamonkey. Ничто не мешает использовать хранилище сертификатов браузеров GoogleChrome/Cromium или создать свое независмое хранилище (Сервис->Параметры->Безопасность->Сертификат):
После того как выбрано хранилище, подключены библиотеки, запускаем libreoffice, создаем файл формата odt и пытаемся его подписать (Файл->Цифровые подписи->Цифровые подписи).
Сертификаты в хранилище Firefox/NSS успешно отображаются и проверяются:
Однако, подпись после выбора сертификата и нажатия кнопки «ОК» не формируется:
Похоже libreoffice не хочет понимать российскими криптоалгоритмы, несмотря на то, что используется NSS из браузера Redfox, который понимает ГОСТ-овые алгоритмы, что подтверждается успешной проверкой сертификатов.
Делаем вторую попытку: на этот раз попытаемся подписать PDF-файл. Для этого подготовленный документ экспортируем в PDF-формат. Для подписания PDF-файла его, естественно, необходимо загрузить (Файл->Цифровые подписи->Подписать PDF). После его загрузки пытаемся его подписать (Файл->Цифровые подписи->Цифровые подписи) (см.выше, выбираем сертификат, прописываем, например, цель подписания документа):
И подпись формируется!!! Мы видим, что подпись, сформирования на базе сертификата «Test 12 512» с ключом ГОСТ Р 34.10-2022 512 бит. Подпись верна.
Выходим из libreoffice. Снова запускаем libreoffice, загружаем подписанный pdf-файл, проверяем подписи. Все ОК. Просматривает сертификаты подписантов. Все ОК. Чудеса! Подпись PDF-файлов работает. Ставим вторую, третью подпись… Все работает. Но что-то не дает покоя. Делаем дополнительную проверку.
Открываем подписанный PDF-файл (я использовал встроенный редактор от mc – Midnight Commander — консольный файловый менеджер для Linux). Находим электронную подпись (/Type/Sig/ ):
Как видим, подпись хранится в символьном шестнадцатеричном виде. Копируем ее и сохраняем в файле. Для конвертации файла в бинарный вид (DER-кодировка) воспользуемся утилитой xxd:
$xxd –p –r <файл с подписью из PDF> > <файл>.der
$
Полученный файл содержит отсоединенную подпись формата PKCS#7 в DER-кодировке. Теперь это подпись можно просмотреть любым asn1-prase-ом, например, утилитой openssl. Но поскольку мы говорим о пакете NSS, то воспользуемся утилитой derdump или утилитой pp:
$pp –t p7 –u –i pkcs7_detach.p7
PKCS #7 Content Info:
PKCS #7 Signed Data:
Version: 1 (0x1)
Digest Algorithm List:
Digest Algorithm (1): SHA-256
Content Information:
PKCS #7 Data:
<no content>
Certificate List:
Certificate (1):
Data:
Version: 3 (0x2)
Serial Number: 4107 (0x100b)
Signature Algorithm: GOST R 34.10-2022 signature with GOST R 34.11-2022-512
Issuer: "[email protected],OGRN=1234567890123,INN=1234
56789012,CN=УЦ 12_512,O=УЦ 12_512,L=GnuPG ГОСТ
-2022-512,ST=Московская область,C=RU"
Validity:
Not Before: Sat Sep 08 07:17:56 2022
Not After : Tue Sep 12 07:17:56 2023
Subject: "C=RU,ST=Московская область,CN=Ф
И О,SN=Фам,givenName=И О,[email protected],L=Город
,STREET=Улица,INN=123456789012,SNILS=12345678901"
Subject Public Key Info:
Public Key Algorithm: GOST R 34.10-2022 512 Public Key:
. . .
Digest Encryption Algorithm: GOST R 34.10-2022 Key 512
Encrypted Digest:
34:9d:6f:37:e6:60:00:ed:fe:ef:f7:96:db:52:66:e1:
47:4c:5d:da:7f:9f:f3:20:50:ac:73:6c:97:db:f9:8d:
43:9b:8f:40:61:99:d3:4b:17:08:b8:34:e3:1e:92:76:
b1:0c:dd:37:01:1e:2a:30:45:68:06:af:3d:33:5e:2f:
71:c8:17:b3:a9:8a:6b:2f:78:9e:e4:b2:00:59:6f:5a:
a0:c5:9e:be:1e:4b:ca:d5:64:25:50:1a:6f:f9:55:b8:
3a:cf:37:a0:04:eb:89:b4:6c:39:77:27:92:de:61:c7:
b1:d3:a5:2f:ef:66:9b:f5:71:42:77:0a:d2:10:7f:50
$
И тут стало понятно, что не все так хорошо. Да, алгоритм подписи Digest Encryption Algorithm: GOST R 34.10-2022 Key 512 в соответствии с выбранным для подписи сертификатом, но подпись формируется от хэша, посчитанному по алгоритму SHA-256 (Digest Algorithm (1): SHA-256). А это неправильно с точки: хэш для GOST R 34.10-2022 Key 512 должен считаться по алгоритму ГОСТ Р 34.11-2022-512.
Приступаем а анализу исходного кода libreoffice: не так страшен черт как его малюют. В данной статье мы рассматриваем использование пакета NSS для формирования электронной подписи. Если кто предпочитает на платформе MS Windows, использовать CryptoAPI (и, соответственно, ГОСТ-CSP), может по аналогии с данным материалом сделать соответствующую доработку.
Анилиз показал, что правки придется внести всего в два файла:
— ~/libreoffice-5.3.7.2/vcl/source/gdi/pdfwriter_impl.cxx
— ~/libreoffice-5.3.7.2/xmlsecurity/source/pdfio/pdfdocument.cxx
Эти изменения связаны с правильным выбором хэш-функции для ГОСТ-овых сертификатов. Выбор хэш-функции будем определять в зависимости от типа ключа сертификата. Выбор хэш-алгоритма, например, в PDFWriter::Sign (файл pdfwriter_impl.cxx) будет выглядеть так:
bool PDFWriter::Sign(PDFSignContext& rContext)
{
#ifndef _WIN32
/*Добавленные переменные*/
SECKEYPublicKey *pubk = NULL;
SECOidTag hashAlgTag;
HASH_HashType hashType;
int hashLen;
CERTCertificate *cert = CERT_DecodeCertFromPackage(reinterpret_cast<char *>(rContext.m_pDerEncoded), rContext.m_nDerEncoded);
if (!cert)
{
SAL_WARN("vcl.pdfwriter", "CERT_DecodeCertFromPackage failed");
return false;
}
/*Получаем из сертификата открытый ключ*/
pubk = CERT_ExtractPublicKey(cert);
if (pubk == NULL)
return NULL;
/*Проверяем тип открытого ключа*/
switch(pubk->keyType){
case gost3410Key:
hashAlgTag = SEC_OID_GOSTHASH;
hashType = HASH_AlgGOSTHASH;
hashLen = SHA256_LENGTH;
break;
case gost3410Key_256:
hashAlgTag = SEC_OID_GOST3411_2022_256;
hashType = HASH_AlgGOSTHASH_12_256;
hashLen = SHA256_LENGTH;
break;
case gost3410Key_512:
hashAlgTag = SEC_OID_GOST3411_2022_512;
hashLen = SHA256_LENGTH * 2;
hashType = HASH_AlgGOSTHASH_12_512;
break;
default:
hashAlgTag = SEC_OID_SHA256;
hashType = HASH_AlgSHA256;
hashLen = SHA256_LENGTH;
break;
}
/*Вычисление хэш*/
HashContextScope hc(HASH_Create(hashType));
. . .
}
Остальные изменения по логике аналогичны этим. Патч для файла ~/libreoffice-5.3.7.2/vcl/source/gdi/pdfwriter_impl.cxx находится
--- pdfwriter_impl_ORIG.cxx 2022-10-25 17:25:39.000000000 0300
pdfwriter_impl.cxx 2022-10-31 19:48:32.078482227 0300
@@ -6698,6 6698,9 @@
CERTCertificate *cert,
SECItem *digest)
{
SECKEYPublicKey *pubk = NULL;
SECOidTag hashAlgTag;
NSSCMSMessage *result = NSS_CMSMessage_Create(nullptr);
if (!result)
{
@@ -6732,8 6735,31 @@
NSS_CMSMessage_Destroy(result);
return nullptr;
}
-
pubk = CERT_ExtractPublicKey(cert);
if (pubk == NULL)
return NULL;
switch(pubk->keyType){
case gost3410Key:
hashAlgTag = SEC_OID_GOSTHASH;
fprintf(stderr, "CreateCMSMessage: gost3410Key Use HASH_AlgGOSTHASH_=%dn", hashAlgTag);
break;
case gost3410Key_256:
hashAlgTag = SEC_OID_GOST3411_2022_256;
fprintf(stderr, "CreateCMSMessage: gost3410Key_256 Use HASH_AlgGOSTHASH_=%dn", hashAlgTag);
break;
case gost3410Key_512:
hashAlgTag = SEC_OID_GOST3411_2022_512;
fprintf(stderr, "CreateCMSMessage: gost3410Key_512 Use HASH_AlgGOSTHASH_=%dn", hashAlgTag);
break;
default:
hashAlgTag = SEC_OID_SHA256;
break;
}
/*
*cms_signer = NSS_CMSSignerInfo_Create(result, cert, SEC_OID_SHA256);
*/
*cms_signer = NSS_CMSSignerInfo_Create(result, cert, hashAlgTag);
if (!*cms_signer)
{
SAL_WARN("vcl.pdfwriter", "NSS_CMSSignerInfo_Create failed");
@@ -6773,8 6799,8 @@
NSS_CMSMessage_Destroy(result);
return nullptr;
}
if (NSS_CMSSignedData_SetDigestValue(*cms_sd, hashAlgTag, digest) != SECSuccess)
- if (NSS_CMSSignedData_SetDigestValue(*cms_sd, SEC_OID_SHA256, digest) != SECSuccess)
{
SAL_WARN("vcl.pdfwriter", "NSS_CMSSignedData_SetDigestValue failed");
NSS_CMSSignedData_Destroy(*cms_sd);
@@ -6982,6 7008,10 @@
bool PDFWriter::Sign(PDFSignContext& rContext)
{
#ifndef _WIN32
SECKEYPublicKey *pubk = NULL;
SECOidTag hashAlgTag;
HASH_HashType hashType;
int hashLen;
CERTCertificate *cert = CERT_DecodeCertFromPackage(reinterpret_cast<char *>(rContext.m_pDerEncoded), rContext.m_nDerEncoded);
@@ -6990,8 7020,33 @@
SAL_WARN("vcl.pdfwriter", "CERT_DecodeCertFromPackage failed");
return false;
}
pubk = CERT_ExtractPublicKey(cert);
if (pubk == NULL)
return NULL;
switch(pubk->keyType){
case gost3410Key:
hashAlgTag = SEC_OID_GOSTHASH;
hashType = HASH_AlgGOSTHASH;
hashLen = SHA256_LENGTH;
break;
case gost3410Key_256:
hashAlgTag = SEC_OID_GOST3411_2022_256;
hashType = HASH_AlgGOSTHASH_12_256;
hashLen = SHA256_LENGTH;
break;
case gost3410Key_512:
hashAlgTag = SEC_OID_GOST3411_2022_512;
hashLen = SHA256_LENGTH * 2;
hashType = HASH_AlgGOSTHASH_12_512;
break;
default:
hashAlgTag = SEC_OID_SHA256;
hashType = HASH_AlgSHA256;
hashLen = SHA256_LENGTH;
break;
}
HashContextScope hc(HASH_Create(hashType));
- HashContextScope hc(HASH_Create(HASH_AlgSHA256));
if (!hc.get())
{
SAL_WARN("vcl.pdfwriter", "HASH_Create failed");
@@ -7005,15 7060,18 @@
HASH_Update(hc.get(), static_cast<const unsigned char*>(rContext.m_pByteRange2), rContext.m_nByteRange2);
SECItem digest;
- unsigned char hash[SHA256_LENGTH];
unsigned char hash[SHA256_LENGTH * 2];
digest.data = hash;
- HASH_End(hc.get(), digest.data, &digest.len, SHA256_LENGTH);
HASH_End(hc.get(), digest.data, &digest.len, hashLen);
hc.clear();
#ifdef DBG_UTIL
{
FILE *out = fopen("PDFWRITER.hash.data", "wb");
- fwrite(hash, SHA256_LENGTH, 1, out);
fwrite(hash, hashLen, 1, out);
fclose(out);
}
#endif
@@ -7078,8 7136,8 @@
fclose(out);
}
#endif
HashContextScope ts_hc(HASH_Create(hashType));
- HashContextScope ts_hc(HASH_Create(HASH_AlgSHA256));
if (!ts_hc.get())
{
SAL_WARN("vcl.pdfwriter", "HASH_Create failed");
@@ -7090,16 7148,19 @@
HASH_Begin(ts_hc.get());
HASH_Update(ts_hc.get(), ts_cms_signer->encDigest.data, ts_cms_signer->encDigest.len);
SECItem ts_digest;
- unsigned char ts_hash[SHA256_LENGTH];
unsigned char ts_hash[SHA256_LENGTH * 2];
ts_digest.type = siBuffer;
ts_digest.data = ts_hash;
- HASH_End(ts_hc.get(), ts_digest.data, &ts_digest.len, SHA256_LENGTH);
HASH_End(ts_hc.get(), ts_digest.data, &ts_digest.len, hashLen);
ts_hc.clear();
#ifdef DBG_UTIL
{
FILE *out = fopen("PDFWRITER.ts_hash.data", "wb");
- fwrite(ts_hash, SHA256_LENGTH, 1, out);
fwrite(ts_hash, hashLen, 1, out);
fclose(out);
}
#endif
@@ -7111,7 7172,8 @@
src.messageImprint.hashAlgorithm.algorithm.data = nullptr;
src.messageImprint.hashAlgorithm.parameters.data = nullptr;
- SECOID_SetAlgorithmID(nullptr, &src.messageImprint.hashAlgorithm, SEC_OID_SHA256, nullptr);
SECOID_SetAlgorithmID(nullptr, &src.messageImprint.hashAlgorithm, hashAlgTag, nullptr);
src.messageImprint.hashedMessage = ts_digest;
src.reqPolicy.type = siBuffer;
@@ -7340,11 7402,13 @@
// Write ESSCertIDv2.hashAlgorithm.
aCertID.hashAlgorithm.algorithm.data = nullptr;
aCertID.hashAlgorithm.parameters.data = nullptr;
- SECOID_SetAlgorithmID(nullptr, &aCertID.hashAlgorithm, SEC_OID_SHA256, nullptr);
SECOID_SetAlgorithmID(nullptr, &aCertID.hashAlgorithm, hashAlgTag, nullptr);
// Write ESSCertIDv2.certHash.
SECItem aCertHashItem;
- unsigned char aCertHash[SHA256_LENGTH];
- HashContextScope aCertHashContext(HASH_Create(HASH_AlgSHA256));
unsigned char aCertHash[SHA256_LENGTH*2];
HashContextScope aCertHashContext(HASH_Create(hashType));
if (!aCertHashContext.get())
{
SAL_WARN("vcl.pdfwriter", "HASH_Create() failed");
@@ -7354,7 7418,8 @@
HASH_Update(aCertHashContext.get(), reinterpret_cast<const unsigned char *>(rContext.m_pDerEncoded), rContext.m_nDerEncoded);
aCertHashItem.type = siBuffer;
aCertHashItem.data = aCertHash;
- HASH_End(aCertHashContext.get(), aCertHashItem.data, &aCertHashItem.len, SHA256_LENGTH);
HASH_End(aCertHashContext.get(), aCertHashItem.data, &aCertHashItem.len, hashLen);
aCertID.certHash = aCertHashItem;
// Write ESSCertIDv2.issuerSerial.
IssuerSerial aSerial;
Патч для файла ~/libreoffice-5.3.7.2/xmlsecurity/source/pdfio/pdfdocument.cxx находится
После внесения изменений проводим сборку пакета libreoffice. Внесенные изменения коснулись трех библиотек (/usr/lib64/libreoffice/program):
Именно эти три библиотеки были заменены в установленном дистрибутиве libreoffice (/usr/lib64/libreoffice/program).
После этого подписание и проверка ГОСТ-подписи в PDF-файлах прошла без сучка и задоринки. И тут на одном из сайтов попадается на глаза такая выдержка:
У Федеральной налоговой службы есть отличный сервис для получения выписки из ЕГРЮЛ для любого юридического лица, причем абсолютно бесплатно. Выписку можно получить в виде документа формата PDF, подписанном квалифицированной электронной подписью. И такую выписку можно отправить в коммерческий банк, госучреждение, и с вас не попросят ее в бумажном виде. В общем, очень удобно.
Заказываем, получаем и проверяем:
Стоит напомнить, что не следует забывать устанавливать в хранилище цепочку доверенных сертификатов для сертификата подписанта. Но это естественно.
Все, теперь есть возможность использования электронной подписи (одной или несколько) в PDF-файлах. Это очень удобно как при согласовании документов, так и хранении документов.
А если кто привык работать с классической электронной подписью в формате PKCS#7 как присоединенной, так и отсоединенной, то для них подготовлена обновленная версия (для платформы Linux и Windows) графического пакета GUINSSPY:
Разработка велась на Python3 и если на платформе Linux проблем не было, то на MS Windows пришлось попотеть с кодировками. Фактически это была отдельная разработка и это требует отдельной статьи. Все эти нюансы можно увидеть в исходном коде.
С помощью этой утилиты можно создать хранилище сертификатов для libreoffice, управлять сертификатами, подписывать файлы и т.д.:
Утилита также позволяет создать запрос на сертификат с генерацией ключевой пары, который затем можно передать в удостоверяющий центр, а полученный сертификат установить в хранилище:
И вот если производители отечественных форков Linux доработали различные пакеты (NSS, Firefox, Thunderbiird, GnuPG/SMIME, SSH, KMail, Kleopatra, LibreOffice, OpenSSL, и т.д и т.п.) для работы с российской криптографией, то тогда можно было бы говорить об импортозамещении в области криптографии.
Автор: saipr
Источник