如何使用命令行中的密码生成 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
允许您生成以下密钥类型:
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
【讨论】:
我在提供的链接或两个子命令的任何手册页中找不到将genrsa
替换为 genpkey
的声明。相反,我知道genpkey
是生成密钥的一般形式,而genrsa
负责RSA
算法。以上是关于如何使用命令行中的密码生成 openSSL 密钥?的主要内容,如果未能解决你的问题,请参考以下文章
使用 ssh-keygen / OpenSSL 生成 SSH 密钥
sh 笔记:OpenSSL生成「自签名」证书,配置Nodejs本地HTTPS服务 - 3.生成.csr文件命令行中的提示内容