2016-11-12 3 views
1

Итак, вот вопрос из моего проекта.Генерация, подписание и проверка цифровой подписи

In this task, we will use OpenSSL to generate digital signatures. Please prepare a file (example.txt) of any size. Also prepare an RSA public/private key pair. Then do the following: 

1. Sign the SHA256 hash of example.txt; save the output in example.sha256. 
2. Verify the digital signature in example.sha256. 
3. Slightly modify example.txt, and verify the digital signature again. 

Please describe how you performed the above three operations (e.g., the exact commands that you used, etc.). Describe what you observed and explain your observations. Please also explain why digital signatures are useful in general. 

Итак, я делаю следующее.

1.Create частный/открытый ключ пары

openssl genrsa -out private.pem 1024 

2. Распаковка Открытый ключ.

openssl rsa -in private.pem -out public.pem -outform PEM -pubout 

3. Создание хэш данных.

echo 'data to sign' > example.txt 

openssl dgst -sha256 <example.txt> hash 

4. Подписать хэш с помощью секретного ключа в файл под названием example.sha256

openssl rsautl -sign -inkey private.pem -keyform PEM -in hash > example.sha256 

5. Проверьте файл (example.txt) и цифровую подпись (пример. sha256)

openssl dgst -sha256 -verify public.pem -signature example.sha256 example.txt 

После всего этого, я получаю сообщение об ошибке, говорящее "Ошибка при проверке "

Пожалуйста, исправьте меня, если я где-то ошибся.

+0

Stack Overflow - это сайт для вопросов программирования и развития. Этот вопрос кажется вне темы, потому что речь идет не о программировании или разработке. См. [Какие темы можно задать здесь] (http://stackoverflow.com/help/on-topic) в Справочном центре. Возможно, лучше сказать [Суперпользователь] (http://superuser.com/) или [Unix & Linux Stack Exchange] (http://unix.stackexchange.com/). Также см. [Где я пишу вопросы о Dev Ops?] (Http://meta.stackexchange.com/q/134306) – jww

ответ

1

Не используйте для этого rsautl.

Согласно PKCS1.5, при подписании формата данных, используемых в операции RSA выглядит примерно так: (. Метаданные определяет, какие хэш-функция используется)

<padding><metadata><hash of input> 

Этот формат - то, что ищет openssl dgst -verify, когда вы пытаетесь проверить подпись. Однако это не то, что вы создаете на своих шагах.

Прежде всего, вывод по умолчанию openssl dgst - это нулевое кодирование полученного хэша, а не необработанные байты.

Во-вторых, rsautl довольно «низкий уровень», и при подписании не добавляются метаданные, которые openssl dgst -verify ожидает, хотя и добавляет отступы.

Эти две вещи вместе означают, что данные, которые вы используете, выглядит так:

<padding><hex digits of hash of input> 

Очевидно, что это не соответствует тому, что openssl dgst -verify ожидает, поэтому проверка неудачна.

Можно было бы создать правильно отформатированный вход для rsautl, но было бы неудобно и иметь дело с деталями ASN.1.Вы также можете использовать rsautl -verify вместо dgst -verify, но для этого потребуется еще несколько деталей, и это означает, что вы используете нестандартный формат подписи.

Простым решением является использование openssl dgst как для создания, так и для проверки подписи. Заменить ваши шаги 3 и 4 (для создания файла example.txt за исключением) с одной командой:

$ openssl dgst -sha256 -sign private.pem -out example.sha256 example.txt 

Это хэш данных, правильно форматирует хэш и выполняет операцию RSA его. Полученный файл должен корректно проверяться командой openssl dgst -verify.

+0

Большое спасибо Мэтту! Теперь он работает! –

+0

Эй, @matt случайный вопрос. Я подписываю сертификат для PKILabServer.com (в списке под общим именем), открываю/etc/hosts и добавляю запись в 127.0.0.1 PKILabServer.com Затем запустите сервер, используя команду% openssl s_server -cert server.pem -www Я указываю браузер на https://PKILabServer.com:4433, а затем он показывает «Недопустимый сертификат безопасности ...», а затем загружаю файл своего сертификата, и сайт загружается отлично. Вопрос в том, что, поскольку PKILabServer.com указывает на localhost, вместо этого мы будем использовать https: // localhost: 4433, мы будем подключаться к одному и тому же веб-серверу. –

+0

Но когда я указываю браузер на https: // localhost: 4433, я получаю сообщение об ошибке «Этот сертификат действителен только для pkilabserver.com ...» Я должен объяснить причину этого в моем проекте. и это то, что я ответил. Пожалуйста, поправьте меня, если я ошибаюсь. –