如何从命令行使用密码短语生成 openSSL 密钥?

首先,如果我不给密码会怎么样?是否使用了某种伪随机短语?我只是在找一些“足够好”的东西来阻止一般的黑客。

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


我最终使用这些命令使它工作,使用 exec () ,它通常被认为是不安全的使用,最好在文件中给密码短语。我可以接受这种风险,因为我确信 PHP 将永远只能在我的电脑上执行(它运行 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,没有他们,这一切都不可能实现。

只有一个遗憾——不管我怎么谷歌,似乎没有人能让 openssl_pkey_new()在 Windows 上使用 Xampp (这是 适当的生成密钥对的方法)

301488 次浏览

如果您不使用密码短语,那么私钥就不会使用任何对称密码进行加密——它的输出完全不受保护。

您可以生成一个密钥对,通过调用在命令行上提供密码,如下所示(在本例中,密码是 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位私钥和公钥对的示例,使用密码 foobar加密的私钥对:

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

genrsa取而代之的是 genpkey

在算法上鼓励使用 genpkey程序 特定的实用程序,因为额外的算法选项和 ENGINE 提供的算法可以使用。

genpkey允许您生成以下关键类型:

  • RSA RSA-PSS EC X25519 X448 ED25519 ED448

当在终端手动运行时,它会提示输入密码:

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
}