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

Maw*_*awg 94 openssl

首先 - 如果我不给出密码,会发生什么?是否使用了某种伪随机短语?我只是在寻找"足够好"的东西来阻止随意的黑客入侵.

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


我终于使用这些命令工作,使用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
Run Code Online (Sandbox Code Playgroud)

很多人都要感谢@caf,没有他们,这是不可能的.

只有一个遗憾 - 无论我有多少谷歌,似乎没有人可以openssl_pkey_new()在Windows上使用Xampp(这是生成密钥对的正确方法)

caf*_*caf 183

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

您可以生成密钥对,使用类似的调用(在这种情况下,密码是foobar)在命令行上提供密码:

openssl genrsa -aes128 -passout pass:foobar 3072
Run Code Online (Sandbox Code Playgroud)

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

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

openssl genrsa -aes128 -passout file:passphrase.txt 3072
Run Code Online (Sandbox Code Playgroud)

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

openssl genrsa -aes128 -passout stdin 3072
Run Code Online (Sandbox Code Playgroud)

您还可以使用带有file:选项的命名管道或文件描述符.


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

openssl rsa -passin file:passphrase.txt -pubout
Run Code Online (Sandbox Code Playgroud)

(这需要标准输入上的加密私钥 - 您可以使用它从文件中读取它-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
Run Code Online (Sandbox Code Playgroud)

  • @Mawg:你的`openssl`命令输出对应于提供的私钥的公钥 - 公钥没有加密(它们不是秘密的),所以使用`-passout`是没有意义的.您可能希望在那里使用`-passin`来提供在第一步中用于加密私钥的密码.我还在答案中添加了一些内容. (4认同)
  • @Mawg:如果`-out`参数在'2048`之后出现,OpenSSL不喜欢它 - 真的,这应该是命令行上的最后一件事(我已经更新了我的答案).看到最后一个例子,我认为这就是你想要的.至于AES-128,[我信任这些事项的人](http://www.schneier.com/blog/archives/2009/07/another_new_aes.html)建议使用AES-256. (3认同)

Stu*_*all 5

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

openssl genpkey -aes-256-cbc -algorithm RSA -out /etc/ssl/private/key.pem -pkeyopt rsa_keygen_bits:4096
Run Code Online (Sandbox Code Playgroud)

但是,从脚本运行时,该命令将不会要求输入密码,因此为了避免在进程中使用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
}
Run Code Online (Sandbox Code Playgroud)

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