Сценарии openssl для генерации большого количества сертификатов без ручного ввода пароля?

Я создал центр сертификации и должен создать и подписать более 50 сертификатов. Я хотел написать сценарий этого процесса. Я не хочу вручную вводить пароль более 100 раз!

Вот команда, от которой я зависал:

openssl req -newkey rsa:1024 -keyout ~/myCA/tempkey.pem -keyform PEM -out ~/myCA/tempreq.pem -outform PEM

Проблема в том, что он хочет, чтобы я создал пароль с этими подсказками:

Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:

Когда меня просто спрашивают пароль для ввода, я могу использовать -passin pass:mypass опция командной строки для openssl, Но это не похоже на работу для создания пароля.

Кроме того, кажется странным, что пароль требуется, когда позже я просто удаляю его:

openssl rsa < tempkey.pem > server_key.pem

Я попытался создать простой скрипт на Ruby:

require 'open3'

Open3.popen2("openssl req -newkey rsa:1024 -keyout ~/myCA/tempkey.pem -keyform PEM -out ~/myCA/tempreq.pem -outform PEM") {|i,o,t|
    i.puts "mySecretPassword"
    i.puts "mySecretPassword"
}

Но, похоже, это тоже не работает. Я по-прежнему получаю подсказку с просьбой создать пароль.

2 ответа

Решение

Проблема заключается в том, что большинство утилит, ожидающих пароль, требуют интерактивного терминала. Так что, если вы попытаетесь подделать его (как вы это сделали со скриптом Ruby), он не будет работать. Вы также можете попробовать:

echo -n "pass\npass\n" | openssl req ....

Хотя это будет работать с некоторыми программами, те, которые требуют интерактивной оболочки, не будут работать.

Вы ищете инструмент под названием ожидаем. Установите его на свой UNIX/Linux/MacOS и посмотрите страницу руководства:

man expect
...
Expect is a program that "talks" to other interactive programs according to a script.  Following the script, Expect
knows what can be expected from a program and what the correct response should be.  An  interpreted  language  pro‐
vides  branching  and high-level control structures to direct the dialogue.  In addition, the user can take control
and interact directly when desired, afterward returning control to the script.
...

Вам нужно создать "ожидаемый сценарий", он действительно зависит от вашей среды - того, что запрашивает приложение. Если это только пароли, это должно быть просто. Вот более сложный пример: http://fixunix.com/openssl/159046-expect-script-doesnt-create-newreq-pem.html

Я думаю, что это должно работать (возможно, вам придется немного его изменить):

#!/usr/bin/expect -f
spawn -console openssl req blah blah blah blah
expect "Enter PEM pass phrase:*" {send "password\r"}
expect "Verifying - Enter PEM pass phrase:*" {send "password\r"}

Удачи!

Как объясняется в этом ответе, вы можете использовать -passout pass:foobar возможность установить пароль через командную строку. Например:

openssl req \
  -newkey rsa:1024 -keyout ~/myCA/tempkey.pem -keyform PEM \
  -out ~/myCA/tempreq.pem -outform PEM \
  -passout pass:foobar \
  -subj "/C=US/ST=Test/L=Test/O=Test/CN=localhost"
Другие вопросы по тегам