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

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

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

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

./apps/openssl smime -verify -noverify -in my_message.txt.p7s -engine dstu -inform DER
engine "dstu" set.
Hello, world!
Verification successful

И позже, после объединения цепочки сертификатов в bundle.pem , мне удалось это сделать:

./apps/openssl smime -verify -CAfile bundle.pem -in /yo/my_message.txt.p7s -engine dstu -inform DER
engine "dstu" set.
Hello, world!
Verification successful

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

Автор модуля OpenSSL DSTU подтвердил, что в настоящий момент модуль не работает должным образом - https://github.com/dstucrypt/openssl-dstu/issues/2#issuecomment-354288000 . . 12223] Думаю, мне придется поискать в другом месте, чтобы найти подходящую реализацию DSTU4145. Я только что узнал о проекте BountyCastle, и его спецификация включает DSTU-4145. Думаю, не осталось вариантов, кроме как написать код Java для проверки подписи.

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

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


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

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

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

  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
    установлен двигатель "дсту".
    openssl (lock_dbg_cb): уже заблокирован (mode = 9, type = 18) на md_rand.c: 387
    openssl (lock_dbg_cb): не заблокирован (режим = 10, тип = 18) в dstu_rbg.c: 87
    Ошибка при получении ключа RSA
    139964169291424: ошибка: 0607907F: подпрограммы цифрового конверта: 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): Я вижу некоторые поля, касающиеся организации и прочего.

Я использую механизм ДСТУ (украинский криптографический стандарт), аналогичный ГОСТу (российский криптографический стандарт).

3
задан 28 December 2017 в 23:19
2 ответа

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

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

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

0
ответ дан 3 December 2019 в 07:50

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

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

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

engine "dstu" set.

Hello, world!

Verification successful

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

0
ответ дан 3 December 2019 в 07:50

Теги

Похожие вопросы