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

90

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

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)

jww
источник

Ответы:

151

Изменить: Это, безусловно, мой самый популярный ответ, и прошло уже несколько лет, поэтому я добавил вариант 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флаг, вы можете указать тему (пример выше).

bahamat
источник
3
Чтение материала через "-subj" прекрасно работает, однако - для меня - только когда OPENSSL_CONF НЕ установлен. IOW: если OPENSSL_CONF установлен, OpenSSL будет пытаться читать оттуда и игнорировать аргумент командной строки "-subj". Мне понадобилось время, чтобы понять.
oberstet
Оберштет: Да, это правда.
Багамат
Можно ли передать ключ субъекта от стандартного ввода ? Я пробовал "-key stdin", "-key fd: 1" и "-key -" .. без удачи.
Оберштет
1
@JeremyBaker: Нет, для этого вам понадобится два этапа. Опустите -x509и, -daysчтобы сгенерировать CSR вместо сертификата, затем используйте свой обычный метод подписания CA.
Багамат
1
@jww - и это время пришло. Начиная с Chrome v58, при попытке загрузить защищенную страницу, но сертификат не содержит совпадающего subjectAltName, он показывает страницу ошибки конфиденциальности с сообщением об ошибке «NET :: ERR_CERT_COMMON_NAME_INVALID». При нажатии на кнопку «Дополнительно» появляется сообщение «... его сертификат безопасности от [missing_subjectAltName]»
Insomniac Software
11

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

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

9000
источник
Увидел опцию в справочной странице. Похоже, я могу получить фразу-пароль без запроса. Спасибо!
А с -passin 'pass:YOUR_PASSWORD'? - doc: openssl.org/docs/man1.0.2/apps/…
andras.tim
5

Принятый ответ нуждается в нескольких небольших исправлениях. Линии ЕС:

-newkey ec
-pkeyopt ec_paramgen_curve:prime256v1

должно быть:

 -newkey ec \
 -pkeyopt ec_paramgen_curve:prime256v1 \

На MacOS - OpenSSL 1.0.2f, установленной через brew, я проверил принятый ответ, как описано ниже

  • Чтобы получить список доступных эллиптических кривых:

    $ openssl ecparam -list_curves
    
  • Чтобы сгенерировать файл ключа:

    $ openssl ecparam -name secp256k1 -out secp256k1.pem
    
  • Чтобы создать сертификат без запроса пароля:

    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
    
  • Для просмотра сертификата:

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

Попробуйте следующую команду:

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

Пропуская часть: -passout pass:foo.

kenorb
источник
2

У @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
jxmallett
источник
Не должна ли последняя строка заканчиваться server.crt?
ᴠɪɴᴄᴇɴᴛ