Избегайте запроса пароля для ключей и запросов на информацию DN

73194
jww

Я использую следующий код для генерации ключей:

apt-get -qq -y install openssl; mkdir -p /etc/apache2/ssl; openssl genrsa -des3 -out server.key 1024; openssl req -new -key server.key -out server.csr; cp server.key server.key.org; openssl rsa -in server.key.org -out server.key; openssl x509 -req -days 12000 -in server.csr -signkey server.key -out server.crt; mv server.crt /etc/apache2/ssl/cert.pem; mv server.key /etc/apache2/ssl/cert.key; rm -f server.key.orig; rm -f server.csr 

У меня есть два вопроса:

  1. Как я могу пропустить запрос пароля? Будет ли это достаточно безопасно для меня? (поскольку в нем не должно быть совершенно глупо, как кто-либо должен иметь возможность взломать сертификат)

  2. Как избежать запроса названия страны, организации и т. Д. Я надеюсь, что смогу дать их в командной строке (на странице руководства показаны только параметры верхнего уровня для OpenSSL)

85

5 ответов на вопрос

139
bahamat

Изменить: Это, безусловно, мой самый популярный ответ, и прошло уже несколько лет, поэтому я добавил вариант ECDSA. Если вы можете использовать ECDSA, вы должны.


Вы можете предоставить всю эту информацию в командной строке.

Один шаг самозаверяющего создания сертификата без пароля:

Версия RSA

openssl req \ -new \ -newkey rsa:4096 \ -days 365 \ -nodes \ -x509 \ -subj "/C=US/ST=Denial/L=Springfield/O=Dis/CN=www.example.com" \ -keyout www.example.com.key \ -out www.example.com.cert 

Версия ECDSA

openssl req \ -new \ -newkey ec \ -pkeyopt ec_paramgen_curve:prime256v1 \ -days 365 \ -nodes \ -x509 \ -subj "/C=US/ST=Denial/L=Springfield/O=Dis/CN=www.example.com" \ -keyout www.example.com.key \ -out www.example.com.cert 

Все подкоманды openssl имеют свою собственную страницу руководства. См man req.


Конкретно отвечая на ваши вопросы и чтобы быть более точным в том, какие именно опции действуют:

  1. В -nodesфлаг сигналы не шифрует ключ, таким образом, вам не нужен пароль. Вы также можете использовать -passout argфлаг. Смотрите PASS PHRASE ARGUMENTSна openssl(1)странице руководства о том, как форматировать arg.

  2. Используя -subjфлаг, вы можете указать тему (пример выше).

Чтение материала через "-subj" прекрасно работает, однако - для меня - только когда OPENSSL_CONF НЕ установлен. IOW: если OPENSSL_CONF установлен, OpenSSL будет пытаться читать оттуда, и _ignore_ "-subj" аргумент командной строки. Мне понадобилось время, чтобы понять. oberstet 12 лет назад 3
Оберштет: Да, это правда. bahamat 12 лет назад 0
Можно ли передать саму тему _key_ от стандартного ввода? Я пробовал "-key stdin", "-key fd: 1" и "-key -" .. без удачи. oberstet 12 лет назад 0
Я разделил вопрос: http://superuser.com/questions/407874/openssl-csr-generation-with-subject-key-from-stdin oberstet 12 лет назад 0
Это поддерживает подстановочный знак? Cerin 10 лет назад 0
Если вы имеете в виду подстановочный знак CN, он должен. Хотя я не пробовал. bahamat 10 лет назад 0
Можно ли указать параметры `-CA` и` -CAkey` в этой одношаговой команде? Я хотел бы подписать его, используя мои файлы CA. Jeremy Baker 8 лет назад 0
@JeremyBaker: Нет, для этого вам понадобится два этапа. Пропустите `-x509` и` -days` для генерации CSR вместо сертификата, затем используйте свой обычный метод подписания CA. bahamat 8 лет назад 1
Это не совсем правильно: `-subj" /C=US/ST=Denial/L=Springfield/O=Dis/CN=www.example.com "` Вы не можете [правильно] установить имя сервера из команды линия. Чтобы поместить имя сервера в * Subject Alternate Name *, вы должны использовать файл конфигурации OpenSSL. В противном случае имя сервера помещается в * Common Name *, и сертификат не будет проверяться в браузерах. jww 7 лет назад 0
@jww SAN не требуется. Браузеры будут проверять тему CN просто отлично. * Subject Alternate Name *, поскольку его имя подразумевает * альтернативное имя * для поля * subject *. bahamat 7 лет назад 0
@bahamat - Цитировать, пожалуйста. Вот документ, который говорит нам, что SAN требуется: [CA / Browser forum Baseline Requirements] (https://cabforum.org/baseline-requirements-documents/); раздел 7.4. тот же документ говорит нам, что CN устарела, но не запрещена (пока). jww 7 лет назад 0
@jww - и это время пришло. Начиная с Chrome v58, при попытке загрузить защищенную страницу, но сертификат не содержит совпадающего subjectAltName, он отображает страницу ошибки конфиденциальности с сообщением об ошибке «NET :: ERR_CERT_COMMON_NAME_INVALID». При нажатии на кнопку «Дополнительно» отображается сообщение «... его сертификат безопасности от [missing_subjectAltName]» Insomniac Software 7 лет назад 1
8
9000

Разве -passinвариант не делает трюк для вас?

С file:pathnameформой вы можете быть в полной безопасности с разрешениями 600 для этого файла.

Увидел опцию в справочной странице. Похоже, я могу получить фразу-пароль без запроса. Спасибо! 13 лет назад 0
И с `-passin 'pass: YOUR_PASSWORD'`? - doc: https://www.openssl.org/docs/man1.0.2/apps/openssl.html#PASS-PHRASE-ARGUMENTS andras.tim 5 лет назад 0
3
Andrei Sura

The accepted answer needs a couple of small corrections. EC Lines:

-newkey ec -pkeyopt ec_paramgen_curve:prime256v1 

should be:

 -newkey ec \ -pkeyopt ec_paramgen_curve:prime256v1 \ 

On MacOS - OpenSSL 1.0.2f installed via brew I verified the the accepted answer as described below

  • To list available Elliptic curves:

    $ openssl ecparam -list_curves 
  • To generate a key file:

    $ openssl ecparam -name secp256k1 -out secp256k1.pem 
  • To generate the cert without password prompt:

    openssl req \ -new \ -newkey ec:secp256k1.pem \ -days 365 \ -nodes \ -x509 \ -subj "/C=US/ST=FL/L=Ocala/O=Home/CN=example.com" \ -keyout server.key \ -out server.crt 
  • To view the cert:

    $ openssl x509 -noout -text -in server.crt 
Чем это отличается от принятого ответа? Ramhound 7 лет назад 0
Единственное важное отличие состоит в том, что я явно перечисляю шаг генерации файла pem. В принятом ответе отсутствуют два символа \, и это заставило меня думать, что команда неверна. Andrei Sura 7 лет назад 1
Вы можете упомянуть этот факт. Если принятый ответ действительно неполный и в нем отсутствуют символы, важно подчеркнуть различия и то, как ваш ответ содержит важную значимую информацию. Ramhound 7 лет назад 0
1
jxmallett

У @bahamat отличный ответ. К сожалению, некоторые версии openssl выдают ошибку при попытке создать сертификат ECDSA с помощью одной команды. Ошибка выглядит примерно так:

routines:EVP_PKEY_CTX_ctrl:invalid operation:pmeth_lib.c:404 

Я использовал openssl 1.0.1e-fipsна CentOS 7.

Создание вашего сертификата с помощью следующих 3 команд, кажется, работает:

openssl ecparam -genkey -name prime256v1 -out key.pem openssl req -new -key key.pem -out csr.pem -subj "/C=US/ST=Denial/L=Springfield/O=Dis/CN=www.example.com" openssl req -x509 -days 365 -key key.pem -in csr.pem -out certificate.pem 
Разве последняя строка не должна заканчиваться на `server.crt`? ᴠɪɴᴄᴇɴᴛ 7 лет назад 0
0
kenorb

Try the following command:

openssl genrsa -des3 -out user.key -passout pass:foo 1024 

The skipping part is: -passout pass:foo.