87

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

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)

5 ответов5

142

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

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

8

Разве опция -passin не поможет вам?

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

3

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

-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
    
1

У @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
1

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .