Ruby 编写openssl脚本以生成多个证书,而无需手动输入密码?

Ruby 编写openssl脚本以生成多个证书,而无需手动输入密码?,ruby,command-line,input,openssl,popen3,Ruby,Command Line,Input,Openssl,Popen3,我已经创建了一个证书颁发机构,需要生成并签署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 phras

我已经创建了一个证书颁发机构,需要生成并签署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:
当我被要求输入密码时,我可以使用
openssl
-passin-pass:mypass
命令行选项。但这似乎不适用于创建密码

此外,似乎很奇怪的是,当我后来通过以下方式删除密码时,需要密码:

openssl rsa < tempkey.pem > server_key.pem

但这似乎也不起作用。我仍然会得到一个手动提示,要求我创建密码。

问题是大多数需要密码的实用程序都需要交互式终端。因此,如果你试图伪造它(就像你在Ruby脚本中所做的那样),它将无法工作。您也可以尝试:

echo -n "pass\npass\n" | openssl req ....
虽然这将适用于某些程序,但那些需要交互式shell的程序将不起作用

您正在搜索名为expect的工具。将其安装在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.
...
您需要创建“expect脚本”,这实际上取决于您的环境—应用程序的要求。如果它只是一个密码,它应该很简单。下面是一个更复杂的例子:

我认为这应该行得通(你可能需要改变一下):

祝你好运

如中所述,您可以使用
-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"

ruby的标准库中有一个OpenSSL类。试着用它:我现在不能写一个完整的例子,但如果我有时间,我会稍后再写。
#!/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"}
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"