如何使用命令行中的密码生成 openSSL 密钥?

Posted

技术标签:

【中文标题】如何使用命令行中的密码生成 openSSL 密钥?【英文标题】:How to generate an openSSL key using a passphrase from the command line? 【发布时间】:2011-05-16 17:35:22 【问题描述】:

首先 - 如果我不提供密码会怎样?是否使用了某种伪随机短语?我只是在寻找“足够好”的东西来阻止普通黑客。

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


我终于使用这些命令让它工作了,使用通常被认为不安全使用的 exec(),最好在文件中提供密码短语。我可以接受这个风险,因为我确信 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(这是生成密钥对的正确方法)

【问题讨论】:

为什么openssl_pkey_new() ... 是生成密钥对的“正确”方式? Windows(通常)没有ps,但从Vista开始就有wmic process get commandline 啊,Vista。也被称为“从这里开始的唯一方法是 Windows”;-) 而且,由于我对 Redmond 产品越来越怀念,几十年前(也就是一眨眼),有 3 个 Widows 版本可用:CE、ME 和 NT ,从而为我们提供寡妇 CE ME NT。有趣的事实/流行测验::CE 实际上是“嵌入式紧凑型”,那么为什么,哦,为什么,他们没有将其命名为 Windows EC? 【参考方案1】:

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

您可以生成一个密钥对,在命令行上使用如下调用提供密码(在本例中,密码为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

【讨论】:

+1 太好了,这行得通!谢谢,如果您能多提供一点帮助,那么您将获得答案……为什么这不起作用? openssl rsa -in privkey.pem -pubout -passout pass:foobar -out pubkey.pem 或者,换一种说法 - 如何从您的命令中获取公钥(与我的略有不同)。我只需要一对匹配的。这只是“足够好”的安全性。 @Mawg:您的 openssl 命令正在输出与提供的私钥相对应的公钥 - 公钥未加密(它们不是秘密),因此使用 -passout 毫无意义.您可能想在那里使用-passin,以提供用于在第一步中加密私钥的密码。我还在答案中添加了一些内容。 @caf,感谢您的反馈(再次+1)。但是,我显然太笨了,不能使用 OpenSSL。我想要文件中的密钥,出于某种原因,openssl genrsa 2048 -aes128 -passout pass:foobar -out privkey.pem 不这样做。您能否给我两个命令 - 一个将私钥生成到文件中,第二个生成公钥(也在文件中)?很抱歉这么麻烦,但我一直在玩它,只是无法让它工作:-( @Mawg:如果 -out 参数出现在 2048 之后,OpenSSL 不喜欢它——真的,这应该是命令行上的最后一件事(我已经更新了我的答案因此)。看最后一个例子,我认为这就是你想要的。至于 AES-128,someone I trust in these matters 推荐它优于 AES-256。【参考方案2】:

genrsa 一直是replaced by genpkey

鼓励使用genpkey 程序而不是算法 特定实用程序,因为附加算法选项和 ENGINE 可以使用提供的算法。

genpkey 允许您生成以下密钥类型:

RSARSA-PSSECX25519X448ED25519ED448

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

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

【讨论】:

我在提供的链接或两个子命令的任何手册页中找不到将 genrsa 替换为 genpkey 的声明。相反,我知道genpkey 是生成密钥的一般形式,而genrsa 负责RSA 算法。

以上是关于如何使用命令行中的密码生成 openSSL 密钥?的主要内容,如果未能解决你的问题,请参考以下文章

使用 ssh-keygen / OpenSSL 生成 SSH 密钥

生成OpenSSL证书时如何自动化PEM密码?

sh 笔记:OpenSSL生成「自签名」证书,配置Nodejs本地HTTPS服务 - 3.生成.csr文件命令行中的提示内容

无法使用 openssl 加密私钥

openssl与java(读取加密码的密钥)

RSA 密钥的生成