Уникайте запиту пароля для ключів та запитів щодо інформації про 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)

Відповіді:


150

Редагувати: Це, безумовно, моя найпопулярніша відповідь, і вже минуло кілька років, тому я додав варіант 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, як відформатувати аргумент.

  2. Використовуючи -subjпрапор, ви можете вказати тему (приклад наведено вище).


3
Читання матеріалів через "-subj" чудово працює, проте для мене - лише тоді, коли OPENSSL_CONF НЕ встановлено. IOW: якщо встановлено OPENSSL_CONF, OpenSSL спробує прочитати звідти і ігнорує аргумент командного рядка "-subj". Мені потрібно було трохи розібратися.
оберстет

oberstet: Так, це правда.
Багамат

Чи можливо передавати предметний ключ від stdin? Я спробував "-key stdin", "-key fd: 1" і "-key -" .. не пощастило.
oberstet

1
@JeremyBaker: Ні, для цього вам знадобиться двоетапний процес. Пропустіть -x509і генеруйте -daysCSR замість сертифіката, а потім скористайтеся звичайним методом підписання CA.
bahamat

1
@jww - і настав цей час. Починаючи з Chrome v58, при спробі завантажити захищену сторінку, але сертифікат не містить відповідного предметаAltName, на ній відображається сторінка про помилку конфіденційності із повідомленням про помилку "NET :: ERR_CERT_COMMON_NAME_INVALID". При натисканні на розширену кнопку відображається повідомлення "... її сертифікат безпеки отримано від [missing_subjectAltName]"
Програмне забезпечення Insomniac

11

Чи не -passinваріант робить для вас трюк?

З file:pathnameформою ви можете бути досить безпечними з дозволами 600 для цього файлу.


Бачив варіант на сторінці man. Схоже, я можу отримати пропуск таким чином, не вимагаючи. Дякую!

А з -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, встановленому за допомогою пивоваріння, я перевірив прийняту відповідь, як описано нижче

  • Щоб перелічити наявні криві еліптики:

    $ openssl ecparam -list_curves
    
  • Щоб створити ключовий файл:

    $ openssl ecparam -name secp256k1 -out secp256k1.pem
    
  • Щоб генерувати cert без запиту пароля:

    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
Єдина важлива відмінність полягає в тому, що я чітко перераховую крок створення файлу pem. У прийнятій відповіді відсутні два \ символи, і це змусило мене думати, що команда невірна.
Андрій Сура

1
Ви можете згадати цей факт. Якщо прийнята відповідь справді неповна і у неї відсутні символи, важливо виділити відмінності та те, як ваша відповідь містить важливу важливу інформацію.
Рамхаунд

3

Спробуйте виконати таку команду:

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

Пропускаючи частину: -passout pass:foo.


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

Чи не повинен закінчуватися останній рядок server.crt?
ᴠɪɴᴄᴇɴᴛ
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.