Expertus metuit
Как проверить цифровую подпись документа из госуслуг через openssl
Опубликовано 2023-04-19 в 09:58

На сайте госуслуг можно заказать различные отчёты и выписки, подписанные электронной подписью. Основной документ обычно идёт в формате PDF, а электронная подпись скачивается отдельным файлом с расширением sig, так называемая отcоединённая электронная подпись. Выглядит скачивание документов с сайта примерно так:

 report

На самом сайте госуслуг есть онлайновый сервис проверки подписи, однако проверить можно и на локальной linux-машине без сторонних проприетарных программ.

Сервис на сайте госуслуг располагается по адресу https://www.gosuslugi.ru/pgu/eds/, нас интересует раздел — электронного документа. ЭП — отсоединенная, в формате PKCS#7, там нужно загрузить документ и отсоединённую электронную подпись. Результат проверки показывается на экране.

Конфигурация системы

Для проверки подписи можно также использовать openssl, однако это требует предварительной настройки. Я всё рассказываю на примере debian/ubuntu.

Для начала нужно поставить пакет libengine-gost-openssl вместе с openssl из стандартного репозитория (в ubuntu нужно подключить universe):

% sudo apt install openssl libengine-gost-openssl

Теперь создаём файл /etc/ssl/gost.cnf со следующим содержимым:

[openssl_init]
engines = engine_section

[engine_section]
gost = gost_section

[gost_section]
engine_id = gost
default_algorithms = ALL
CRYPT_PARAMS = id-Gost28147-89-CryptoPro-A-ParamSet

Редактируем файл /etc/ssl/openssl.cnf и добавляем в самый конец строчку:

.include /etc/ssl/gost.cnf

Если всё сконфигурировано правильно, вы должны увидеть корректно посчитанный дайджест после такой команды:

% echo 123 | openssl dgst -md -md_gost12_256 
md_gost12_256(stdin)= 7b73f0736f6f8bd6edc4288452e19436b82db3a9f6bff8d4f402f15295095ade

Если же вы видите ошибки, значит, что-то пошло не так:

% echo 123 | openssl dgst -md -md_gost12_256
dgst: Unknown option or message digest: md_gost12_256
dgst: Use -help for summary.
4047B534FE7E0000:error:0308010C:digital envelope routines:inner_evp_generic_fetch:unsupported:
../crypto/evp/evp_fetch.c:373:Global default library context, Algorithm (md_gost12_256 : 0), Properties (<null>)

Проверка электронной подписи

Допустим, у вас два файла с госуслуг:

  • Онлайн-выписка помещение.pdf — собственно документ
  • Онлайн-выписка помещение.pdf.sig — остоединённая электронная подпись документа

Внутри файла .sig находится закодированный в Base64 файл подписи в формате PKCS#7, в таком виде он нам не нужен, поэтому мы его декодируем в бинарный формат:

% base64 -d 'Онлайн-выписка помещение.pdf.sig' > 'Онлайн-выписка помещение.pdf.der'

И дальше уже выполняем проверку:

% openssl smime -verify -in Онлайн-выписка\ помещение.pdf.der -inform DER -content Онлайн-выписка\ помещение.pdf -noverify -out /dev/null
Verification successful

Комментарии

Текст комментария (допустимая разметка: *курсив*, **полужирная**, [ссылка](http://example.com) или <http://example.com>) Посетители-анонимы, обратите внимение, что более чем одна гиперссылка в тексте (включая оную из поля «веб-сайт») приведёт к блокировке комментария для модерации. Зайдите на сайта с использованием аккаунта на twitter, например, чтобы посылать комментарии без этого ограничения.
Имя (обязательно, 50 символов или меньше)
Опциональный email, на который получать ответы (не будет опубликован)
Веб-сайт
© 2006—2023 Sergey Stolyarov | Работает на pyrengine