Обновление 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. Закрытый ключ и сертификат как-то связаны друг с другом.
Как мне проверить подпись на файле?
Вот что я делаю:
Извлеките открытый ключ из сертификата (полученного от органа):
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" 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 могут справиться с этим напрямую.