如何从命令行使用密码生成OpenSSL密钥?


107

首先-如果我不输入密码怎么办?是否使用某种伪随机短语?我只是在寻找“足够好”的东西来阻止随意的黑客。

第二-如何从命令行生成密钥对,并在命令行上提供密码短语?


我最终使用这些命令使用exec()使其正常工作,通常认为这样做不安全,最好在文件中提供PassPhrase。我可以接受这种风险,因为我确信PHP只会在我的PC(运行Windows且没有PS命令)上执行。

openssl genrsa -aes128 -passout pass:foobar -out privkey.pem 2048
openssl rsa -in privkey.pem -passin pass:foobar -pubout -out privkey.pub

非常感谢@caf,否则,这将是不可能的。

唯一的遗憾-无论我使用多少Google,似乎都无法openssl_pkey_new()在Windows上使用Xampp(这是生成密钥对的正确方法)


4
为什么openssl_pkey_new()...生成密钥对的“正确”方法?
杰克·伯杰

Windows(通常)没有,ps但是自Vista以来就拥有wmic process get commandline
dave_thompson_085

Answers:


210

如果您不使用密码短语,则私钥不会使用任何对称密码进行加密-完全不受保护地输出。

您可以生成密钥对,并使用以下调用在命令行上提供密码(在本例中,密码为foobar):

openssl genrsa -aes128 -passout pass:foobar 3072

但是,请注意,此密码短语可以被当时在计算机上运行的任何其他进程捕获,因为命令行参数通常对所有进程可见。

更好的选择是将密码短语写入受文件权限保护的临时文件中,并指定以下内容:

openssl genrsa -aes128 -passout file:passphrase.txt 3072

或在标准输入上提供密码:

openssl genrsa -aes128 -passout stdin 3072

您还可以将带名称的管道与file:选项一起使用,或与文件描述符一起使用。


为了获得匹配的公钥,您需要使用openssl rsa,提供与-passin用于加密私钥的参数相同的密码:

openssl rsa -passin file:passphrase.txt -pubout

(这需要标准输入上的加密私钥-您可以使用来从文件中读取它-in <file>)。


在文件中创建3072位私钥和公钥对的示例,其中私钥对已使用password加密foobar

openssl genrsa -aes128 -passout pass:foobar -out privkey.pem 3072
openssl rsa -in privkey.pem -passin pass:foobar -pubout -out privkey.pub

+1好极了!谢谢,如果您能再提供一些帮助,那么您将获得答案...为什么不起作用?openssl rsa -in privkey.pem -pubout -passout pass:foobar -out pubkey.pem
Mawg说恢复Monica 2010年

或者换一种说法-如何从您的命令中获取公钥(与我的稍有不同)。我只需要一对配对。这只是“足够好”的安全性。
Mawg说恢复Monica 2010年

4
@Mawg:您的openssl命令正在输出与提供的私钥相对应的公钥-公钥未加密(它们不是秘密),因此使用-passout没有任何意义。您可能想要在-passin此处使用,以提供第一步中用于加密私钥的密码。我还为答案添加了一些内容。
caf 2010年

@caf,感谢您的宝贵反馈(再次+1)。但是,我显然太笨了,无法使用OpenSSL。我想要文件中的密钥,由于某种原因,我openssl genrsa 2048 -aes128 -passout pass:foobar -out privkey.pem不这样做。您能否给我两个命令-一个用于将私钥生成到文件中,另一个用于生成公钥(也在文件中)?抱歉,您这么讨厌,但我一直在玩弄它,只是无法使它起作用:-(
Mawg说,请恢复Monica 2010年

3
@Mawg:如果-out参数在2048- 后面,那么OpenSSL不喜欢它-确实,这应该是命令行上的最后一件事(我已经这样更新了我的答案)。看到最后一个示例,我想这就是您想要的。至于AES-128,我相信这些事情的人推荐使用AES-256。
caf 2010年

9

genrsa在终端中手动运行时,它已genpkey替换,它将提示您输入密码:

openssl genpkey -aes-256-cbc -algorithm RSA -out /etc/ssl/private/key.pem -pkeyopt rsa_keygen_bits:4096

但是,从脚本运行时,该命令不会要求输入密码,因此为了避免在进程中使用shell脚本中的函数来查看密码,请执行以下操作:

get_passwd() {
    local passwd=
    echo -ne "Enter passwd for private key: ? "; read -s passwd
    openssl genpkey -aes-256-cbc -pass pass:$passwd -algorithm RSA -out $PRIV_KEY -pkeyopt rsa_keygen_bits:$PRIV_KEYSIZE
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.