- Вопрос или проблема
- Ответ или решение
- Как проверить подпись на файле с использованием OpenSSL и кастомного движка
- Шаг 1: Подготовьте необходимые файлы
- Шаг 2: Извлечение открытого ключа
- Шаг 3: Проверка подписи
- Шаг 4: Проверка с использованием цепочки сертификатов
- Шаг 5: Извлечение подписанного содержимого
- Часто встречающиеся ошибки
- Заключение
Вопрос или проблема
Обновление 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:
Вот мои файлы:
- сообщение для проверки: https://www.dropbox.com/s/pt7ms096lygz8es/my_message.txt.p7s?dl=0
- сообщение для проверки в формате ASN.1: https://gist.github.com/gmile/a9bb5cb57fc8195d74029251eb3946ba
- сертификат(ы), с которыми я пытаюсь выполнить проверку: https://acsk.privatbank.ua/arch/docs/PrivatBank.zip
У меня есть файл, подписанный кем-то его закрытым ключом: signed_content.txt
. У меня также есть сертификат от ЦС. Закрытый ключ и сертификат как-то связаны между собой.
Как мне проверить подпись на файле?
Вот что я делаю:
-
Извлекаю открытый ключ из сертификата (полученного от уполномоченного органа):
openssl x509 -pubkey -inform der -in PrivateCerts/CA-3004751DEF2C78AE010000000100000049000000.cer -noout -engine dstu > public_key.txt
-
Пытаюсь проверить содержимое файла:
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 и следить за обновлениями движков, чтобы избежать потенциальных проблем и уязвимостей.