Менеджер сертификатов для libreoffice windows

Время на прочтение
4 мин

Количество просмотров 13K

image LibreOffice — мощный офисный пакет. LibreOffice бесплатен и имеет открытый исходный код.

Офисный пакет содержит в себе текстовый и табличный процессор, программу для подготовки и просмотра презентаций, векторный графический редактор, систему управления базами данных и редактор формул:

image

Более того, проводимая политика импортозамещения, когда на столах чиновников вместо MS Windows все чаще появляются отечественные форки Linux, способствует широкому распространению пакета LibreOffice и в органах государственного управления.

LibreOffice интенсивно развивается и с момента своего появления вобрал в себя множество дополнительных возможностей. Одной из таких возможностей является электронная подпись (цифровая подпись в терминологии LibreOffice) документа. Для формирования электронной подписи (Файл → Цифровые подписи → Цифровые подписи … → Подписать документ) используются личные сертификаты:

image

Глядя на картинку, у неискушенного пользователя (а тем более у чиновника) возникает глубокое чувство непонимания: что за файл собирается открываться, что за пароль должен вводиться!

Следует отметить, что это не очень удачный перевод разработчиков LibreOffice. Речь идет не о файле, а о токене/смарткарте PKCS#11, и не о пароле, а о пользовательском PIN-коде для токена. Должно быть что-то следующего вида:

image

Тут мы подошли к главному вопросу: где и как хранятся сертификаты, которые LibreOffice использует для формирования электронной подписи документов?

В качестве хранилища сертификатов LibreOffice использует, как правило, хранилища сертификатов, создаваемых и поддерживаемых продуктами Mozilla (Firefox, Thunderbird, SeaMonkey). По умолчанию это хранилище сертификатов почтового клиента Thunderbird (Сервис → Параметры… → Безопасность → Сертификат…):

image

Хранилища сертификатов для продуктов Mozilla создаются средствами пакета NSS (Network Security Services). С помощью утилит командной строки можно создать и свое хранилище сертификатов, например:

bash-4.3$ cd /home/a513/tmp 
bash-4.3$ mkdir db_for_libre 
bash-4.3$ modutil -create -dbdir /home/a513/tmp/db_for_libre 
WARNING: Performing this operation while the browser is running could cause 
corruption of your security databases. If the browser is currently running, 
you should exit browser before continuing this operation. Type  
'q <enter>' to abort, or <enter> to continue:  
bash-4.3$ ls -l db_for_libre 
итого 60 
-rw------- 1 a513 a513 65536 авг 31 16:49 cert8.db 
-rw------- 1 a513 a513 16384 авг 31 16:49 key3.db 
-rw------- 1 a513 a513 16384 авг 31 16:49 secmod.db 
bash-4.3$

Созданное хранилище сертификатов в каталоге /home/a513/tmp/db_for_libre содержит три базы данных, а именно cert8.db, key3.db и secmod.db. Для их создания используется старая версия базы данных Berkeley (обычно она описывается в документах NSS как« DBM ») в отличие от хранилища сертификатов, скажем, в google-chrome, для создания и поддержки которого также используется пакет NSS, но для поддержки баз данных (cert9.db, key4.db и pkcs11.txt) в хранилище используется механизм SQLite3. Для работы и с тем и другим хранилищем используются одни и те же утилиты NSS, просто в параметре –d (каталог хранилища) перед путем к хранилищу, если вы собираетесь работать с новым форматом (SQLite3) хранилища, достаточно указать префикс: -d sql:<путь к хранилищу>.

Более того, также просто из хранилища сертификатов старого формата (cert8.db, key3.db и secmod.db) создается и хранилище в новом формате (cert9.db, key4.db и pkcs11.txt). Для этого достаточно выполнить утилиту работы с сертификатами certutil в режиме просмотра ключей (-K) или сертификатов (-L) с параметром –X:

bash-4.3$ ls -l /home/a513/tmp/db_for_libre/ 
итого 60 
-rw------- 1 a513 a513 65536 авг 31 17:56 cert8.db 
-rw------- 1 a513 a513 16384 авг 31 17:56 key3.db 
-rw------- 1 a513 a513 16384 авг 31 16:49 secmod.db 
bash-4.3$ certutil -L -d sql:/home/a513/tmp/db_for_libre -X  
Certificate Nickname             Trust Attributes   SSL,S/MIME, JAR/XPI 
bash-4.3$ ls -l /home/a513/tmp/db_for_libre/                
итого 120 
-rw------- 1 a513 a513 65536 авг 31 17:56 cert8.db 
-rw------- 1 a513 a513 28672 авг 31 17:56 cert9.db 
-rw------- 1 a513 a513 16384 авг 31 17:56 key3.db 
-rw------- 1 a513 a513 28672 авг 31 17:56 key4.db 
-rw------- 1 a513 a513   440 авг 31 17:56 pkcs11.txt 
-rw------- 1 a513 a513 16384 авг 31 16:49 secmod.db 
bash-4.3$

Как видим, теперь в хранилище есть базы данных как в старом, так и новом форматах.
К сожалению, обратное преобразование мне неизвестно и поэтому новые хранилища сертификатов, например, google-chrome (~/.pki) в LibreOffice недоступны.

Пакет NSS поддерживает работу с токенами/смарткартами PKCS#11, на которых, как правило, и хранят свои личные сертификаты с закрытыми ключами пользователи. Отметим, что личные сертификаты сегодня получают в удостоверяющих центрах .

Итак, мы остановились на том, что у нас был запрошен PIN-код к токену. Подключить токены/смарткарты PKCS#11 можно как через Firefox, Thunderbir, Seamonkey, так и утилитой modutil. Например, для подключения облачного токена достаточно выполнить команду:

$modutil –add LS11CLOUD2016 –libfile libls11cloud.so –dbdir /home/a513/tmp/db_for_libre 
$

Именно к этому токену LibreOffice и запросил пароль:

image

После ввода пароля будет доступен список личных сертификатов, которые можно использовать для формирования подписи. Здесь также можно просмотреть содержимое сертификатов:

image

Как только будет выбран сертификат, произойдет формирование электронной подписи:

image

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

В заключение еще несколько слов о работе с хранилищем сертификатов. Если пользователь решил создавать свое хранилище отличное от продуктов Mozilla и для этого использовать утилиты командной строки NSS, то удобно воспользоваться графической оболочкой GUINSS.

Данная утилита позволяет подключать токены/смарткарты, импортировать корневые сертификаты и сертификаты из защищенного контейнераPKCS#12. Позволяет также создавать запросы (CSR) на сертификаты в формате PKCS#10:

image

Сформированный запрос на сертификат может быть отправлен в УЦ для получения сертификата:

image

Созданное хранилище может найти применение и за рамками LibreOffice.
P.S. В офисном пакете сертификаты из хранилища теперь используются для формирования электронной подписи по ГОСТ Р 34.10-2001/2012 в PDF-документах.

Форум КриптоПро
 » 
Общие вопросы
 » 
Общие вопросы
 » 
CryptoProOfficeSignature на LibreOffice должна работать?


Offline

andrei186

 


#1
Оставлено
:

6 апреля 2022 г. 13:17:12(UTC)

andrei186

Статус: Участник

Группы: Участники

Зарегистрирован: 06.04.2022(UTC)
Сообщений: 10
Российская Федерация
Откуда: moscow

Купил лицензию CryptoProOfficeSignature
Имею типа флешки с электронной подписью, которой я подписываюсь на электронных торгах.

На Word работает.

На LibreOffice при нажатии на Sign Document в поле Select Certificate никаких сертификатов не показывается. Кнопка View Certificate посерена

При нажатии на Start Certificate Manager отвечает Could not find any Certificate Manager

Как помочь гОрю?


Вверх


Offline

Андрей *

 


#2
Оставлено
:

6 апреля 2022 г. 13:43:35(UTC)

Андрей *

Статус: Сотрудник

Группы: Участники

Зарегистрирован: 26.07.2011(UTC)
Сообщений: 12,191
Мужчина
Российская Федерация

Сказал «Спасибо»: 464 раз
Поблагодарили: 1963 раз в 1517 постах

Здравствуйте.

В системных требованиях не указана поддержка LibreOffice.

https://www.cryptopro.ru/products/office/signature

Техническую поддержку оказываем тут
Наша база знаний


Вверх

WWW


Offline

andrei186

 


#3
Оставлено
:

6 апреля 2022 г. 14:28:29(UTC)

andrei186

Статус: Участник

Группы: Участники

Зарегистрирован: 06.04.2022(UTC)
Сообщений: 10
Российская Федерация
Откуда: moscow

Спасибо, но я не спрашивал, что не написано в системных требованиях.
Но я видел, что там написано про Линукс, а в Линуксе нет МС Ворда.
Вы можете прямо (да/нет) ответить, работает ли это приложение с Libre Office?


Вверх


Offline

Андрей *

 


#4
Оставлено
:

6 апреля 2022 г. 15:53:10(UTC)

Андрей *

Статус: Сотрудник

Группы: Участники

Зарегистрирован: 26.07.2011(UTC)
Сообщений: 12,191
Мужчина
Российская Федерация

Сказал «Спасибо»: 464 раз
Поблагодарили: 1963 раз в 1517 постах

Автор: andrei186 Перейти к цитате

Спасибо, но я не спрашивал, что не написано в системных требованиях.
Но я видел, что там написано про Линукс, а в Линуксе нет МС Ворда.
Вы можете прямо (да/нет) ответить, работает ли это приложение с Libre Office?

Так написано — это где? Вы путаете ПО (СКЗИ и плагин для MS Office) и его назначение.

Вы купили продукт «КриптоПро Office Signature».
Он не работает в LINUX.

Техническую поддержку оказываем тут
Наша база знаний


Вверх

WWW


Offline

andrei186

 


#5
Оставлено
:

6 апреля 2022 г. 16:03:26(UTC)

andrei186

Статус: Участник

Группы: Участники

Зарегистрирован: 06.04.2022(UTC)
Сообщений: 10
Российская Федерация
Откуда: moscow

Хорошо, я ошибся про Линукс.
Но Вы продолжаете не отвечать на вроде бы прямой вопрос: Работает ли с Libre Office


Вверх


Offline

Андрей *

 


#6
Оставлено
:

6 апреля 2022 г. 16:07:04(UTC)

Андрей *

Статус: Сотрудник

Группы: Участники

Зарегистрирован: 26.07.2011(UTC)
Сообщений: 12,191
Мужчина
Российская Федерация

Сказал «Спасибо»: 464 раз
Поблагодарили: 1963 раз в 1517 постах

Автор: andrei186 Перейти к цитате

Хорошо, я ошибся про Линукс.
Но Вы продолжаете не отвечать на вроде бы прямой вопрос: Работает ли с Libre Office

Я сразу ответил — этого продукта нет в списке поддерживаемых «КриптоПро Office Signature».
«КриптоПро Office Signature» — для продуктов MS

Техническую поддержку оказываем тут
Наша база знаний


Вверх

WWW


Offline

andrei186

 


#7
Оставлено
:

6 апреля 2022 г. 16:28:38(UTC)

andrei186

Статус: Участник

Группы: Участники

Зарегистрирован: 06.04.2022(UTC)
Сообщений: 10
Российская Федерация
Откуда: moscow

Блин! Второй раз говорю, что я не спрашивал, что входит в Ваши списки. Бывают случаи, когда в списке нет, а работает. Иногда нужны танцы с бубном. Нормальные разработчики всегда дают подсказки.
Еще раз, можете ответить прямо Да или Нет?


Вверх


Offline

Санчир Момолдаев

 


#8
Оставлено
:

6 апреля 2022 г. 21:12:44(UTC)

Санчир Момолдаев

Статус: Сотрудник

Группы: Модератор, Участники
Зарегистрирован: 03.12.2018(UTC)
Сообщений: 1,032
Российская Федерация

Сказал(а) «Спасибо»: 86 раз
Поблагодарили: 217 раз в 208 постах

Нет

Техническую поддержку оказываем тут
Наша база знаний


Вверх


Offline

andrei186

 


#9
Оставлено
:

7 апреля 2022 г. 11:43:02(UTC)

andrei186

Статус: Участник

Группы: Участники

Зарегистрирован: 06.04.2022(UTC)
Сообщений: 10
Российская Федерация
Откуда: moscow

Спасибо, Санчир. А как получатель письма, подписанного в Ворде при помощи CryptoProOfficeSignature, увидит эту подпись? Я в Ворде ее не вижу


Вверх


Offline

Андрей *

 


#10
Оставлено
:

7 апреля 2022 г. 12:15:25(UTC)

Андрей *

Статус: Сотрудник

Группы: Участники

Зарегистрирован: 26.07.2011(UTC)
Сообщений: 12,191
Мужчина
Российская Федерация

Сказал «Спасибо»: 464 раз
Поблагодарили: 1963 раз в 1517 постах

Автор: andrei186 Перейти к цитате

А как получатель письма, подписанного в Ворде при помощи CryptoProOfficeSignature, увидит эту подпись? Я в Ворде ее не вижу

signed.png (32kb) загружен 19 раз(а).

Техническую поддержку оказываем тут
Наша база знаний


Вверх

WWW

Пользователи, просматривающие эту тему

Guest

Форум КриптоПро
 » 
Общие вопросы
 » 
Общие вопросы
 » 
CryptoProOfficeSignature на LibreOffice должна работать?

Быстрый переход
 

Вы не можете создавать новые темы в этом форуме.

Вы не можете отвечать в этом форуме.

Вы не можете удалять Ваши сообщения в этом форуме.

Вы не можете редактировать Ваши сообщения в этом форуме.

Вы не можете создавать опросы в этом форуме.

Вы не можете голосовать в этом форуме.

Время на прочтение
10 мин

Количество просмотров 20K

Пришла пора, несмотря на все пожары, исполнить свой гражданский долг – заплатить налоги. Платить налоги мы будем через портал Госуслуги. В личный кабинет портала Госуслуг будем входить с помощью электронной подписи ( терминология портала Госуслуг ), т.е. имея на руках сертификат, полученный в аккредитованном удостоверяющем центре (УЦ), и закрытый ключ. И то и другое я храню на токене PKCS#11 с поддержкой российской криптографии:

И вот, выполнив свой гражданский долг, я решил еще раз проверить работу электронной подписи в офисном пакете libreoffice.

Почему я решил это сделать? Для доступа к порталу Госуслуг я использую ОС Linux и браузер Redfox, который представляет собой доработанный с учетом поддержки российской криптографии браузер Mozilla Firefox. Как известно, офисный пакет libreoffice в качестве хранилища сертификатов также использует хранилище NSS.

Браузер Redfox-52 был установлен в папку /usr/local/lib64/firefox-52.

Для подключения библиотек пакета NSS (Network Security Services) с поддержкой ГОСТ-алгоритмов устанавливаем значение переменной LD_LIBRARY_PATH следующим образом:

$export LD_LIBRARY_PATH=/usr/local/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-2012 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-2012 signature with GOST R 34.11-2012-512
                    Issuer: "E=ca_12_512@lissi.ru,OGRN=1234567890123,INN=1234
                        56789012,CN=УЦ 12_512,O=УЦ 12_512,L=GnuPG ГОСТ
                        -2012-512,ST=Московская область,C=RU"
                    Validity:
                        Not Before: Sat Sep 08 07:17:56 2018
                        Not After : Tue Sep 12 07:17:56 2023
                    Subject: "C=RU,ST=Московская область,CN=Ф
                         И О,SN=Фам,givenName=И О,E=xx@xx.ru,L=Город
                        ,STREET=Улица,INN=123456789012,SNILS=12345678901"
                    Subject Public Key Info:
                        Public Key Algorithm: GOST R 34.10-2012 512 Public Key:
.  .  .
                Digest Encryption Algorithm: GOST R 34.10-2012 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-2012 Key 512 в соответствии с выбранным для подписи сертификатом, но подпись формируется от хэша, посчитанному по алгоритму SHA-256 (Digest Algorithm (1): SHA-256). А это неправильно с точки: хэш для GOST R 34.10-2012 Key 512 должен считаться по алгоритму ГОСТ Р 34.11-2012-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_2012_256;
	    hashType = HASH_AlgGOSTHASH_12_256;
	    hashLen = SHA256_LENGTH;
	    break;
	case gost3410Key_512:
	    hashAlgTag = SEC_OID_GOST3411_2012_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	2017-10-25 17:25:39.000000000 +0300
+++ pdfwriter_impl.cxx	2018-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_=%d\n", hashAlgTag);
+	    break;
+	case gost3410Key_256:
+	    hashAlgTag = SEC_OID_GOST3411_2012_256;
+fprintf(stderr, "CreateCMSMessage: gost3410Key_256 Use HASH_AlgGOSTHASH_=%d\n", hashAlgTag);
+	    break;
+	case gost3410Key_512:
+	    hashAlgTag = SEC_OID_GOST3411_2012_512;
+fprintf(stderr, "CreateCMSMessage: gost3410Key_512  Use HASH_AlgGOSTHASH_=%d\n", 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_2012_256;
+	    hashType = HASH_AlgGOSTHASH_12_256;
+	    hashLen = SHA256_LENGTH;
+	    break;
+	case gost3410Key_512:
+	    hashAlgTag = SEC_OID_GOST3411_2012_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 находится

здесь:

--- pdfdocument_ORIG.cxx	2017-10-25 17:25:39.000000000 +0300
+++ pdfdocument.cxx	2018-10-31 19:49:34.174485641 +0300
@@ -2400,6 +2400,19 @@
     case SEC_OID_PKCS1_SHA512_WITH_RSA_ENCRYPTION:
         eOidTag = SEC_OID_SHA512;
         break;
+    case SEC_OID_GOST3410_SIGN_256:
+    case SEC_OID_GOST3411_2012_256:
+        eOidTag = SEC_OID_GOST3411_2012_256;
+	break;
+    case SEC_OID_GOST3410_SIGN_512:
+    case SEC_OID_GOST3411_2012_512:
+        eOidTag = SEC_OID_GOST3411_2012_512;
+	break;
+    case SEC_OID_GOST3410_SIGNATURE:
+    case SEC_OID_GOSTHASH:
+        eOidTag = SEC_OID_GOSTHASH;
+	break;
+
     default:
         break;
     }
@@ -2453,6 +2466,16 @@
     case SEC_OID_SHA512:
         nMaxResultLen = msfilter::SHA512_HASH_LENGTH;
         break;
+    case SEC_OID_GOST3411_2012_256:
+        nMaxResultLen = msfilter::SHA256_HASH_LENGTH;
+	break;
+    case SEC_OID_GOST3411_2012_512:
+        nMaxResultLen = msfilter::SHA512_HASH_LENGTH;
+	break;
+    case SEC_OID_GOSTHASH:
+        nMaxResultLen = msfilter::SHA256_HASH_LENGTH;
+	break;
+
     default:
         SAL_WARN("xmlsecurity.pdfio", "PDFDocument::ValidateSignature: unrecognized algorithm");
         return false;

После внесения изменений проводим сборку пакета libreoffice. Внесенные изменения коснулись трех библиотек (/usr/lib64/libreoffice/program):

  • libvcllo.so;
  • libxmlsecurity.so;
  • libxsec-xmlsec.so

Именно эти три библиотеки были заменены в установленном дистрибутиве 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, и т.д и т.п.) для работы с российской криптографией, то тогда можно было бы говорить об импортозамещении в области криптографии.

вопросы

Из нашей статьи вы узнаете:

Что такое Libreoffice и для чего его используют

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

Программа использует OpenDocument Format(ODF) — файл в XML-формате. Стандарт этого файла разработан некоммерческой организацией по стандартизации — OASIS. Цель создания — разработка независимого формата, который читается в любом текстовом редакторе, без привязки к определённому программному обеспечению и работает на любой операционной системе.

Принят 1 мая 2006 года независимым комитетом по стандартам как международный стандарт ISO/IEC 26300. В июле 2015 года стандартизован ODF версии 1.2 (ISO/IEC 26300-1:2015).

Политика разработчиков предусматривает бесплатное скачивание, установку и свободное распространение LibreOffice без нарушения авторского права. Это способствует популярности программного обеспечения в органах государственного управления.

Благодаря поддержке более 40 языков и открытому формату файла, пользователи со всего мира модифицируют, тестируют новые версии и предлагают свои идеи касательно развития проекта, учитывая актуальные тенденции, применяемые к электронным документам. Одна из таких тенденций электронная цифровая подпись (ЭЦП).

Как подписать документ в libreoffice

Для подписания документов в программе вам понадобится ПО КриптоАРМ (для локальной подписи и шифрования файлов) и ЭЦП. Всё необходимое для работы с электронной подписью вы можете приобрести в нашем УЦ «Астрал-М» по выгодной цене, заполнив форму обратной связи.

Типы файлов и расширения

Mime-типы и расширения файлов, которые можно подписать с помощью LibreOffice и СКЗИ КриптоПро:

Вид документа MIME-тип Расширение
Текстовый документ application/vnd.oasis.opendocument.text odt
Текстовый документ, используемый как шаблон application/vnd.oasis.opendocument.text-template ott
Графический документ application/vnd.oasis.opendocument.graphics odg
Графический документ, используемый как шаблон application/vnd.oasis.opendocument.graphics-template otg
Документ презентации application/vnd.oasis.opendocument.presentation odp
Документ презентации, используемый как шаблон application/vnd.oasis.opendocument.presentation-template otp
Электронная таблица application/vnd.oasis.opendocument.spreadsheet ods
Электронная таблица, используемая как шаблон application/vnd.oasis.opendocument.spreadsheet-template ots
Документ диаграммы application/vnd.oasis.opendocument.chart odc
Документ диаграммы, используемый как шаблон application/vnd.oasis.opendocument.chart-template otc
Документ изображения application/vnd.oasis.opendocument.image odi
Документ изображения, используемый как шаблон application/vnd.oasis.opendocument.image-template oti
Документ формулы application/vnd.oasis.opendocument.formula odf
Документ формулы, используемый как шаблон application/vnd.oasis.opendocument.formula-template otf
Составной текстовый документ application/vnd.oasis.opendocument.text-master odm
Текстовый документ, используемый как шаблон для HTML-документов application/vnd.oasis.opendocument.text-web oth
Portable Document Format PDF application/pdf pdf

Подписание ODF документов

Для примера будет использоваться ПО «Текст LibreOffice»

  1. Запустить текстовый редактор LibreOffice:
  2. «Пуск» — «Офис» — «Текст LibreOffice»
  3. Открыть нужный *.odt документ
    1. перейти в меню
    2. «Файл» — «Цифровые подписи» — «Цифровые подписи…»
    3. Нажать кнопку «Подписать документ…»;
    4. В открывшемся окне следует выбрать нужный сертификат и нажать кнопку «Подписать»;

    Выбор подходящего сертификата

    1. Нажать кнопку «Закрыть»
    2. В результате на экране появится сообщение, что подпись верна.

    Сообщение о достоверности подписи

Подпись макросов в документе

Подпись макросов в документе происходит автоматически. Для того чтобы подписать только макросы, необходимо выбрать команду «Сервис» — «Макросы» — «Цифровые подписи», далее действия, описанные выше.

  • Печать

Страницы: 1 146 147 [148] 149 150 178   Вниз

Тема: Libre Office  (Прочитано 593384 раз)

0 Пользователей и 2 Гостей просматривают эту тему.

Оффлайн
Platon

любая врезка удаляется нажатием на клавишу Delete, если она (врезка) была выделена

Это был какой-то специфичный глюк(документ редактировали 6 человек на разных платформах, поэтому отследить момент и причины его возникновения не представляется возможным), поскольку любая врезка созданная после переносилась и удалялась штатно, а врезка загнанная в крайний угол выше колонтикула не удалялась вообще. Решил проблему созданием нового документа и последовательным переносом контента из предыдущего документа.

«Быть сильным – не значит превосходить в силе, а уметь слабого поднять до высот своих.» Рабиндранат Тагор


Оффлайн
drion

Вопрос:
каждый раз ЛО почему то начинает «восстановление документа».
И ещё: на панели иногда два значка сохранения. Что это значит?


Оффлайн
Kompilainenn

каждый раз ЛО почему то начинает «восстановление документа».

некорректно завершена работа либры, либо сбой файловой системы

на панели иногда два значка сохранения. Что это значит?

скриншот?


Оффлайн
Platon

Подскажите как подписать документ Цифровой подписью, соответствующий диалог я нашел «Файл — Цифровые подписи», а вот дальше, где взять сертификат(сформировать подпись), вернее даже как навести LO на путь к нему, нажимаю Управление сертификатами и появляется сообщение «Менеджер сертификатов не найден».   

«Быть сильным – не значит превосходить в силе, а уметь слабого поднять до высот своих.» Рабиндранат Тагор


Оффлайн
s-001s

Пришел друг с проблемой. нумерация страниц чрез две. (4, 6 , 8 ….) Есть одна страница в альбомном стиле она нумеруеться по порядку (8,9,10). Захожу в параметры стиля Базовый и виже где показано изображение страницы слева тёмно серая старница  (фантомная страница) а страва нормальная. Как убрать эту фонтомную страницу?


Пользователь добавил сообщение 12 Июня 2018, 14:44:41:


Сам разобрался, макет страницы не тот стоял 8)

« Последнее редактирование: 12 Июня 2018, 14:44:41 от s-001s »


Оффлайн
F12

нажимаю Управление сертификатами и появляется сообщение «Менеджер сертификатов не найден».   

— у меня без проблем открывается Seahorse (Пароли и ключи)
— попробуй нажать Справка, там предлагается вариант подписи через Свойства


Оффлайн
Platon

нажимаю Управление сертификатами и появляется сообщение «Менеджер сертификатов не найден».   

— у меня без проблем открывается Seahorse (Пароли и ключи)
— попробуй нажать Справка, там предлагается вариант подписи через Свойства

Благодарю, теперь понятно чем создавать ключ.

«Быть сильным – не значит превосходить в силе, а уметь слабого поднять до высот своих.» Рабиндранат Тагор


Оффлайн
s-001s


Оффлайн
freemind

переключил панель инструментов вот в такой вид, как назывется не запомнил:

как переключить обратно? (в менюшку с обычными кнопками)


Оффлайн
DoctorRover

freemind,
Похоже, один раздел ленты не поместился по ширине экрана.
Можно сделать такой манёвр. Переключиться в режим просмотра печати (раздел ленты «Вид», под кнопкой «Масштаб», правая из трёх расположенных там кнопочек; или Ctrl+Shift+O). В этом режиме справа появится раздел ленты с кнопкой «Меню». Дальше, полагаю, всё будет уже очевидно :)
На всякий случай напоминаю, что разметка панели «Лента» в данный момент относится к экспериментальным возможностям.

You’re never too old to Rock’n’Roll if you’re too young to die.


Оффлайн
s-001s

Добрый день. Возникла проблема, обновился до версии 6.1.0.1, после откатился до 6.0.5.2 и у меня пропала вкладка «Ленты» (разрещение на экспериментальные возможности даны), есть только вкладочкая лента и всё. Кто знает как это исправить?


Оффлайн
DoctorRover

Установил LibreOffice 6.1 RC1. Понравилась новая тема значков Colibre)

You’re never too old to Rock’n’Roll if you’re too young to die.


Оффлайн
DoctorRover

Автор блога ProLibreOffice опубликовал опрос (из одного вопроса) касательно нового виджета вставки специальных символов.

Опрос по поводу нового виджета для вставки специальных символов в LibreOffice 6.1

Повздорил с дизайнерами LibreOffice на предмет того, что они новый виджет для вставки специальных символов, который запилили в версии 6.0 (очень удобный на мой взгляд) взяли и по умолчанию спрятали в версии 6.1. В связи с этим мне нужна статистика от пользователей Либры, кто что думает на этот счет. Прошу всех неравнодушных пройти опрос из одного вопроса на эту тему.
Ссылка на опрос по поводу нового виджета для вставки специальных символов в LibreOffice 6.1:
https://docs.google.com/forms/d/e/1FAIpQLSfVqGMXKzz4vjCzqzK2cZi2mBFk9qUFpkrIci5VeUilmBlRFw/viewform

Источник

Предлагаю всем пользователям LibreOffice принять участие в этом опросе.
Лично мне новый виджет вставки специальных символов, появившийся в версии LO 6.0, очень нравится. Так же, как и автор опроса, считаю, что такой полезный инструмент должен быть на панели инструментов по умолчанию.

You’re never too old to Rock’n’Roll if you’re too young to die.


Оффлайн
Kompilainenn

Установил LibreOffice 6.1 RC1. Понравилась новая тема значков Colibre)

есть еще одна новая тема значков Karasa Jaga, оцените уж и её ;-)


Оффлайн
DoctorRover

RemDerBauer, да, Karasa Jaga я тоже конечно посмотрел)) Хорошая тема. Полагаю, те, кому нравилась тема Oxygen, будут довольны)
Но лично мне Colibre больше понравилась :)

You’re never too old to Rock’n’Roll if you’re too young to die.


  • Печать

Страницы: 1 146 147 [148] 149 150 178   Вверх

  • Меню выбора диска при загрузке windows
  • Мем тест оперативной памяти windows 10 на русском
  • Менеджер окон для windows 10
  • Меню пуск windows 11 посередине
  • Медленное завершение работы windows 10