Избегайте запроса пароля для ключей и запросов на информацию 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
У меня есть два вопроса:
Как я могу пропустить запрос пароля? Будет ли это достаточно безопасно для меня? (поскольку в нем не должно быть совершенно глупо, как кто-либо должен иметь возможность взломать сертификат)
Как избежать запроса названия страны, организации и т. Д. Надеюсь, что смогу указать их в командной строке (на странице руководства показаны только параметры верхнего уровня для 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
,
Конкретно отвечая на ваши вопросы и более четко определив, какие именно параметры действуют:
-nodes
Отметьте сигналы, чтобы не шифровать ключ, поэтому вам не нужен пароль. Вы также можете использовать-passout arg
флаг. УвидетьPASS PHRASE ARGUMENTS
вopenssl(1)
Страница man для того, как отформатировать arg.С использованием
-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
параметр, поэтому создание сертификата без запроса пароля можно сделать проще, читабельнее и надежнее:
Сгенерируйте ключ:
openssl genrsa 2048 > localhost.key
Создайте конфигурацию
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
Создайте сертификат:
openssl req -x509 -new -out localhost.crt -key localhost.key -config openssl.cnf -days 11499 -nodes -extensions v3_ca -sha256
Альтернативно с CSR:
Создайте новый CSR:
openssl req -new -out localhost.csr -key localhost.key -config openssl.cnf
Просмотрите данные в 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: [...]
Создайте сертификат:
openssl x509 -req -days 11499 -in localhost.csr -signkey localhost.key -out localhost.crt -extensions v3_ca -extfile openssl.cnf -sha256
Посмотреть данные в сертификате:
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
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