首先 - 如果我不给出密码,会发生什么?是否使用了某种伪随机短语?我只是在寻找“足够好”的东西来阻止随意的黑客入侵。
第二 - 如何从命令行生成密钥对,在命令行上提供密码?
我终于使用这些命令工作,使用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(这是生成密钥对的正确方式)
答案 0 :(得分:165)
如果您不使用密码短语,则私钥不会使用任何对称密码加密 - 输出完全不受保护。
您可以生成密钥对,使用类似的调用(在这种情况下,密码为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 :(得分:3)
genrsa
已replaced by 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
}