4

我创建了一个证书颁发机构,需要生成和签署 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"
}

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

4

2 回答 2

6

本答案中所述,您可以使用该-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"
于 2015-02-23T20:44:15.977 回答
3

问题是大多数需要密码的实用程序确实需要交互式终端。因此,如果您尝试伪造它(就像您使用 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.
...

您需要创建“预期脚本”,这实际上取决于您的环境 - 应用程序要求什么。如果只是密码,应该很简单。这是更复杂的示例: 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"}

祝你好运!

于 2013-03-13T09:58:33.917 回答