Назад | Перейти на главную страницу

Как проверить подпись в файле с помощью 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.

Думаю, мне придется поискать в другом месте, чтобы найти подходящую реализацию DSTU4145. Я только что узнал о проекте BountyCastle, и это Технические характеристики включает ДСТУ-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
    engine "dstu" set.
    openssl (lock_dbg_cb): already locked (mode=9, type=18) at md_rand.c:387
    openssl (lock_dbg_cb): not locked (mode=10, type=18) at dstu_rbg.c:87
    Error getting RSA key
    139964169291424:error:0607907F:digital envelope routines:EVP_PKEY_get1_RSA:expecting an rsa key:p_lib.c:288:
    

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


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

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

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

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

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

Простой 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, Я получаю сообщение об ошибке проверки Verify error:unable to get local issuer certificate, но это связано с самопроверкой сертификата, а не с сообщением. Мой инструмент openssl1.0 похож на обычный openssl 1.0.2o с примененными патчами gost и dstu.

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 могут справиться с этим напрямую.