OpenSSL генерирует сертификат с порядком байтов, кодировкой и кодировкой

У меня возникли проблемы при создании сертификата с помощью инструмента командной строки openssl.

Спецификации для закрытого ключа:

"Цифровая подпись с использованием 1024-битного ключа RSA с хэш-функцией SHA-1 (RSA-SHA1-1024)"

Создание его следующим образом

openssl genrsa -out rsa.key 1024

Генерация CSR

openssl req -new -key rsa.key -out csr.csr

Сертификат имеет следующую спецификацию:

  • Формат = х.509
  • Charset = UTF-8
  • Кодировка = Base-64
  • Endianness = Little Endian
  • Дополнение OAEP = дополнение PKCS1 v1.5
  • Размер закрытого ключа = 1024 бита
  • Формат хэш-сообщения = SHA-1

Я пробовал множество комбинаций из следующих:

openssl x509 -req -utf8 -enc base64 -pkcs -sha1 rsa:1024 -in csr.csr -signkey rsa.key -out server.crt

Я не могу заставить работать большой набор комбинаций вышеупомянутой команды, всегда какой-то параметр, который его нарушает.

Согласно спецификации мы должны подписать дайджест сообщения RSA с данным сертификатом. Я немного сбит с толку, почему и как мы должны это делать, может быть, это ошибочная спецификация?

Техническая документация

Я использую OpenSSL 1.1.0f 25 мая 2017

Endianess Я даже не могу найти, как установить его с помощью инструмента командной строки openssl, любая помощь здесь будет принята с благодарностью!

1 ответ

Решение

Если я не читаю это неправильно, этот документ, кажется, противоречит сам себе. В нем говорится о создании сертификата и о том, что с самоподписанными сертификатами все в порядке, но потом говорится, что единственное, что они хотят, чтобы вы отправили в NTA, - это открытый ключ. Подписание данных не требует сертификата, только закрытый ключ. Поэтому мне интересно, почему они не просто заставляют вас создавать открытую / закрытую пару ключей, а не целый сертификат, который всегда будет сидеть на коробке и никогда не привыкнет.

Вот как вы можете создать простой закрытый ключ RSA 1024 и извлечь открытый ключ в его собственный файл:

openssl genrsa -out rsa.key 1024
openssl rsa -in rsa.key -outform PEM -pubout -out rsa.pub

rsa.pub файл - это то, что вы отправите в NTA. Я никогда не слышал о том, чтобы кто-то явно обращался с порядком байтов в openssl. Так что я могу ошибаться, но вам, скорее всего, не стоит об этом беспокоиться. Кодировка UTF8, вероятно, имеет значение только для реальных сертификатов с текстовыми полями, такими как Тема. Openssl выводит файлы PEM с кодировкой ASCII, что нормально (и нормально), потому что PEM кодируется в Base64. PKCS1 v1.5 также является стандартным.

Итак, теперь у вас есть ключи. Давайте попробуем подписать их пример данных из раздела 2.2.5 их документа. Во-первых, добавьте данные в файл, чтобы их было проще использовать в примерах.

echo -n 'signature_from_previous_receipt;2014-01-24;23:59:59;123456789;1250.00;1000.00' > data.txt

Отобразите хеш SHA1, чтобы доказать, что у нас есть данные, соответствующие примеру

openssl dgst -sha1 data.txt

Хешируйте и подписывайте данные, конвертируйте их в base64 без разрывов строк и сохраняйте в файл.

openssl dgst -sha1 -sign rsa.key data.txt | openssl base64 -A -out data.sig

Гипотетически, текст внутри data.sig теперь то, что вы использовали бы для "signature_for_this_receipt" из примера.

Чтобы проверить, мы можем просто сделать следующее, которое должно вывести "Verified OK".

openssl dgst -sha1 -verify rsa.pub -signature <(openssl base64 -d -A -in data.sig) data.txt

Если по какой-то причине вам нужен файл действительного сертификата, вы можете заменить первую команду, генерирующую закрытый ключ, этим одним вкладышем, который сгенерирует и ключ, и самозаверяющий сертификат. Вам по-прежнему нужна та же вторая команда для извлечения открытого ключа.

openssl req -nodes -x509 -sha1 -utf8 -newkey rsa:1024 -keyout rsa.key -out server.crt -days 365 -subj "/CN=MyCert"
Другие вопросы по тегам