Как проверить подпись файла с помощью OpenSSL с использованием пользовательского движка

Вопрос или проблема

Обновление 28 декабря 2017 г. – 3:

Автор модуля OpenSSL DSTU любезно предоставил патч для реализации OpenSSL+DSTU с исправлением проблемы и оказал дальнейшую помощь.

Мне удалось выполнить необходимое с помощью этой команды:

./apps/openssl smime -verify -noverify -in my_message.txt.p7s -engine dstu -inform DER
engine "dstu" установлен.
Привет, мир!
Проверка успешна

А позже, после конкатенации цепочки сертификатов в bundle.pem, мне удалось сделать следующее:

./apps/openssl smime -verify -CAfile bundle.pem -in /yo/my_message.txt.p7s -engine dstu -inform DER
engine "dstu" установлен.
Привет, мир!
Проверка успешна

Обновление 28 декабря 2017 г. – 2:

Автор модуля OpenSSL DSTU подтвердил, что на данный момент модуль работает неправильно – https://github.com/dstucrypt/openssl-dstu/issues/2#issuecomment-354288000.

Думаю, мне придется искать в другом месте подходящую реализацию DSTU4145. Я только что узнал о проекте BountyCastle, и его спецификация включает DSTU-4145. Похоже, больше нет вариантов, кроме как написать немного кода на Java для выполнения проверки подписи.

Обновление 28 декабря 2017 г. – 1:

Вот мои файлы:


У меня есть файл, подписанный кем-то его закрытым ключом: signed_content.txt. У меня также есть сертификат от ЦС. Закрытый ключ и сертификат как-то связаны между собой.

Как мне проверить подпись на файле?

Вот что я делаю:

  1. Извлекаю открытый ключ из сертификата (полученного от уполномоченного органа):

    openssl x509 -pubkey -inform der -in PrivateCerts/CA-3004751DEF2C78AE010000000100000049000000.cer -noout -engine dstu > public_key.txt
    
  2. Пытаюсь проверить содержимое файла:

    openssl rsautl -verify -in my_message.txt.p7s -inkey public_key.txt -pubin -engine dstu
    engine "dstu" установлен.
    openssl (lock_dbg_cb): уже заблокировано (mode=9, type=18) в md_rand.c:387
    openssl (lock_dbg_cb): не заблокировано (mode=10, type=18) в dstu_rbg.c:87
    Ошибка получения RSA ключа
    139964169291424:error:0607907F:digital envelope routines:EVP_PKEY_get1_RSA:ожидался rsa ключ:p_lib.c:288:
    

Также, как мне извлечь фактическое содержимое подписанного файла?


Неправильный ли файл у меня? Я могу просмотреть его ASN.1 содержимое:

openssl asn1parse -inform DER -in my_message.txt.p7s -i

ASN.1 структура кажется в порядке (если честно, я знаю слишком мало о ASN.1): я вижу некоторые поля о организации и прочее.

Я использую DSTU engine (Украинский криптостандарт), схожий с GOST (Российский криптостандарт).

openssl rsautl обрабатывает только алгоритм RSA, не поддерживая другие алгоритмы: ни DSA, ни ECDSA, ни GOST, ни DSTU и т.д. openssl pkeyutl -sign/-verify может обрабатывать любой алгоритм, доступный через стандартный интерфейс EVP, который ваш движок, предположительно, должен поддерживать.

Тем не менее, большинство алгоритмов подписи фактически подписывают хэш данных, а не оригинальные данные. В частности, я вижу, что BouncyCastle имеет несколько схем подписи с использованием GOST3411 (хэш) с DSTU4145 (и с или без LE, т.е. кодирование в порядке младшего байта). Для этого вам нужно либо явно выполнить хэширование и затем использовать openssl pkeyutl, либо проще использовать openssl dgst -$hashname -sign/-verify, что объединяет эти функции. Для встроенных хэшей можно сократить до openssl $hashname -sign/-verify, но я не знаю, работает ли это для хэша движка.

В любом случае, вам почти наверняка не следует рассматривать весь signed_content.txt как данные, тем более как хэш данных. Если он имеет структуру ASN.1, он, вероятно, включает подписанные данные (как только часть структуры) плюс значение подписи, а также, вероятно, метаданные или даже другие данные. Если это самая распространенная структура, CMS/PKCS7, команда OpenSSL может обработать это напрямую.

Как мне проверить подпись на файле?

Простой openssl smime -verify ... должен работать даже с движком dstu:

$ openssl1.0 smime -verify -noverify -engine dstu -inform DER -in my_message.txt.p7s

engine "dstu" установлен.

Привет, мир!

Проверка успешна

Это то, что вам нужно? Когда я убираю опцию -noverify, я получаю ошибку проверки Ошибка проверки:не удалось получить локальный сертификат удостоверяющего центра, но это связано с самопроверкой сертификата, а не с сообщением. Мой инструмент openssl1.0 похож на обычный openssl 1.0.2o с примененными патчами gost и dstu.

Ответ или решение

Как проверить подпись на файле с использованием OpenSSL и кастомного движка

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

Шаг 1: Подготовьте необходимые файлы

Перед тем как приступить к проверке, убедитесь, что у вас есть следующие файлы:

  • Файл с подписью (my_message.txt.p7s): Это файл, содержащий подписываемые данные и саму подпись.
  • Сертификат CA: Сертификат, используемый для верификации подписи.

Шаг 2: Извлечение открытого ключа

Первый шаг заключается в извлечении открытого ключа из сертификата, который вы получили от удостоверяющего центра. Используйте следующую команду:

openssl x509 -pubkey -inform der -in PrivateCerts/CA-3004751DEF2C78AE010000000100000049000000.cer -noout -engine dstu > public_key.txt

Пояснение: Опция -inform der указывает на формат сертификата (DER), а -engine dstu позволяет использовать конкретный движок, связанный с DSTU.

Шаг 3: Проверка подписи

С помощью извлеченного открытого ключа вы можете проверить подпись на файле. Для этого выполните следующую команду:

openssl smime -verify -noverify -in my_message.txt.p7s -engine dstu -inform DER

Параметры:

  • -verify: Указывает, что вы хотите выполнить проверку подписи.
  • -noverify: Разрешает игнорирование проверки сертификата участника.
  • -inform DER: Указывает формат входного файла (DER).

При успешной проверке вы увидите сообщение об успешной верификации.

Шаг 4: Проверка с использованием цепочки сертификатов

Если вам необходимо выполнить более строгую проверку, добавьте параметр -CAfile, указывая на файл с цепочкой сертификатов:

openssl smime -verify -CAfile bundle.pem -in my_message.txt.p7s -engine dstu -inform DER

Шаг 5: Извлечение подписанного содержимого

Для извлечения фактического содержимого подписанного файла можно использовать openssl smime с параметром -verify в сочетании с -noverify. Вы можете использовать следующую команду:

openssl smime -verify -noverify -in my_message.txt.p7s -engine dstu -inform DER -out extracted_content.txt

Объяснение: Данная команда не только проверяет подпись, но и извлекает содержимое файла в extracted_content.txt.

Часто встречающиеся ошибки

При выполнении этих команд вы можете столкнуться с ошибками. Например, Error getting RSA key может указывать на то, что вы пытаетесь использовать неверный алгоритм для данного движка. Убедитесь, что используете правильные команды для работы с вашим движком.

Заключение

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

Оцените материал
Добавить комментарий

Капча загружается...