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"