脚本化openssl可以生成许多证书,而无需手动输入密码?

Mic*_*rey 4 ruby command-line openssl input popen3

我已经创建了证书颁发机构,并且需要生成并签署50多个证书。我想编写这个过程的脚本。我不想手动输入密码100次以上!

这是我挂断的命令:

openssl req -newkey rsa:1024 -keyout ~/myCA/tempkey.pem -keyform PEM -out ~/myCA/tempreq.pem -outform PEM
Run Code Online (Sandbox Code Playgroud)

问题是,它要我用以下提示创建密码:

Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
Run Code Online (Sandbox Code Playgroud)

当系统仅要求我输入密码时,可以使用的-passin pass:mypass命令行选项openssl。但这似乎不适用于创建密码。

另外,当以后我最终将其删除时,需要输入密码似乎很奇怪:

openssl rsa < tempkey.pem > server_key.pem
Run Code Online (Sandbox Code Playgroud)

我尝试创建一个简单的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"
}
Run Code Online (Sandbox Code Playgroud)

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

lza*_*zap 5

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

\n\n
echo -n "pass\\npass\\n" | openssl req ....\n
Run Code Online (Sandbox Code Playgroud)\n\n

虽然这适用于某些程序,但那些需要交互式 shell 的程序将不起作用。

\n\n

您正在寻找名为expect 的工具。在 UNIX/Linux/MacOS 上安装它并查看手册页:

\n\n
man expect\n...\nExpect is a program that "talks" to other interactive programs according to a script.  Following the script, Expect\nknows what can be expected from a program and what the correct response should be.  An  interpreted  language  pro\xe2\x80\x90\nvides  branching  and high-level control structures to direct the dialogue.  In addition, the user can take control\nand interact directly when desired, afterward returning control to the script.\n...\n
Run Code Online (Sandbox Code Playgroud)\n\n

您需要创建“期望脚本”,这实际上取决于您的环境 - 应用程序的要求。如果只是密码,应该很简单。这是更复杂的示例:http://fixunix.com/openssl/159046-expect-script-doesnt-create-newreq-pem.html

\n\n

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

\n\n
#!/usr/bin/expect -f\nspawn -console openssl req blah blah blah blah\nexpect "Enter PEM pass phrase:*" {send "password\\r"}\nexpect "Verifying - Enter PEM pass phrase:*" {send "password\\r"}\n
Run Code Online (Sandbox Code Playgroud)\n\n

祝你好运!

\n


Fer*_*eia 5

该答案中所述,您可以使用该-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"
Run Code Online (Sandbox Code Playgroud)