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

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

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)

8 ответов

Решение

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

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

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

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

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

-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
    

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

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

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

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

Лично мне не нравится верхний ответ, предоставляющий множество параметров, его трудно читать. К счастью, OpenSSL предоставляетconfigпараметр, поэтому создание сертификата без запроса пароля можно сделать проще, читабельнее и надежнее:

  1. Сгенерируйте ключ:

    openssl genrsa 2048 > localhost.key

  2. Создайте конфигурациюopenssl.cnf

            [dn]
    CN=localhost
    
    [req]
    distinguished_name = dn
    prompt = no
    
    [alt_names]
    DNS.1 = localhost
    DNS.2 = 127.0.0.1
    
    [v3_ca]
    subjectAltName=@alt_names
    keyUsage=digitalSignature
    extendedKeyUsage=serverAuth
    
  3. Создайте сертификат:

    openssl req -x509 -new -out localhost.crt -key localhost.key -config openssl.cnf -days 11499 -nodes -extensions v3_ca -sha256

  4. Альтернативно с CSR:

    1. Создайте новый CSR:

      openssl req -new -out localhost.csr -key localhost.key -config openssl.cnf

    2. Просмотрите данные в CSR:

      openssl req -in localhost.csr -text -noout

                 Certificate Request:
           Data:
               Version: 1 (0x0)
               Subject: CN = localhost
               Subject Public Key Info:
                   Public Key Algorithm: rsaEncryption
                       Public-Key: (2048 bit)
                       Modulus:
                           [...]
                           67:9f
                       Exponent: 65537 (0x10001)
               Attributes:
                   (none)
                   Requested Extensions:
           Signature Algorithm: sha256WithRSAEncryption
           Signature Value:
               [...]
      
    3. Создайте сертификат:

      openssl x509 -req -days 11499 -in localhost.csr -signkey localhost.key -out localhost.crt -extensions v3_ca -extfile openssl.cnf -sha256

  5. Посмотреть данные в сертификате:openssl x509 -in localhost.crt -text -noout

             Certificate:
         Data:
             Version: 3 (0x2)
             Serial Number:
                 2b:1e:48:e4:58:19:b4:5e:50:c5:45:6d:0b:3d:07:c8:c5:26:86:cb
             Signature Algorithm: sha256WithRSAEncryption
             Issuer: CN = localhost
             Validity
                 Not Before: Sep  5 11:29:05 2022 GMT
                 Not After : Feb 28 11:29:05 2054 GMT
             Subject: CN = localhost
             Subject Public Key Info:
                 Public Key Algorithm: rsaEncryption
                     Public-Key: (2048 bit)
                     Modulus:
                         [...]
                     Exponent: 65537 (0x10001)
             X509v3 extensions:
                 X509v3 Subject Alternative Name:
                     DNS:localhost, DNS:127.0.0.1
                 X509v3 Key Usage:
                     Digital Signature
                 X509v3 Extended Key Usage:
                     TLS Web Server Authentication
                 X509v3 Subject Key Identifier:
                     5D:72:9B:F4:3E:76:37:15:81:59:28:10:97:A7:A9:5E:37:D9:C5:EF
         Signature Algorithm: sha256WithRSAEncryption
         Signature Value:
             [...]
    

Если вы создаете самозаверяющий сертификат для тестирования HTTPS, вам, вероятно, потребуется добавить расширения x509 v3 (в первую очередь, subjectAltName) , чтобы он работал в большинстве основных браузеров, но вы также можете указать их на терминале (начиная с OpenSSL 1.1.1):

      openssl req -x509 -new -nodes                                      \
  -newkey RSA:2048                                                 \
  -days 365                                                        \
  -subj '/C=US/ST=Denial/L=Earth/O=Dis/CN=anything_but_whitespace' \
  -addext 'subjectAltName = DNS:localhost'                         \
  -addext 'authorityKeyIdentifier = keyid,issuer'                  \
  -addext 'basicConstraints = CA:FALSE'                            \
  -addext 'keyUsage = digitalSignature, keyEncipherment'           \
  -addext 'extendedKeyUsage=serverAuth'                            \
  -out self-signed.crt                                             \
  -keyout private.key

( Однако это не будет работать в Firefox .)

https://linux.die.net/man/1/openssl используйте-passin env:var

Пример

      export PASSIN="mycertsecretpass"
openssl pkcs12  -passin env:PASSIN -in ${cn}.pfx -nocerts -nodes > ${cn}.key.pem
Другие вопросы по тегам