我正在使用ssh-keygen
(OpenSSH v8.9) 在无头服务器上自动生成密钥。如果不需要密码,这很简单,但如果确实需要密码,则变得困难。ssh-keygen
生成新密钥时,在 stdin 上需要 3 项内容:y
,因为密钥文件已经存在,以及所需的密码,重复两次。
经过一些简化,我这样做如下:
$ printf -v input "y\npassword\npassword\n"
$ echo -n "$input"
y
password
password
$ echo -n "$input" | ssh-keygen -t ed25519 -a100 -f tmpkey
当我最初这样做时,我得到了这个输出:
Generating public/private ed25519 key pair.
tmpkey already exists.
Overwrite (y/n)? ssh_askpass: exec(/usr/bin/ssh-askpass): No such file or directory
密钥对已创建,但私钥未加密。因此,我ssh-askpass
在装有 X 的测试系统上安装了ssh-keygen
。现在运行时,我得到了一个 OpenSSH 身份验证弹出窗口,并且 stdin 现在被忽略了。显然,即使我想要,也无法在无头服务器上使用图形弹出窗口。
那么到底发生了什么?我可以说服ssh-keygen
自动输入密码吗?如果不行,我是否可以用来openssl
添加密码,甚至创建文件?我确实想从中获取 OpenSSH 格式的密钥 - 我已经使用 openssl 自动化了 PKCS#8。
编辑
我找到了(not )SSH_ASKPASS_REQUIRE
的环境变量。如果我将其设置为“never”,它确实会停止弹出窗口,但现在只会读取 stdin 的第一行,并忽略接下来两行的密码。所以,它对我没有任何帮助。ssh
ssh-keygen
ssh-askpass
ssh-keygen
您可以使用 PuTTYgen 生成密钥,正如 dave_thompson_085 在评论中指出的那样。剧透:您可能不想这样做,因为
puttygen
似乎对 OpenSSH 的支持不完整。这将为你获取一个 OpenSSH 私钥:
密码为
stdin
,密钥为stdout
,因此您的 bash 历史记录或输出中没有任何记录ps
。您现在可以通过以下方式获取公钥:到目前为止,这比好得多
ssh-keygen
。然而,美中不足的是-a100
。上述过程生成一个具有默认 16 个 KDF 轮次的密钥文件。文档
puttygen
(实际上是手册页;我认为没有书面文档)没有明确说明如何设置 KDF 轮数,但似乎可以使用 进行设置--ppk-param passes=$rounds
。如果您正在生成 PuTTY PPK 文件,这似乎有效,但对于 OpenSSH 文件则无效。puttygen
没有抱怨,但密钥文件仍然显示 16 轮,并且设置rounds
一个大数字对解密密钥所需的时间没有影响。要查找文件中编码的轮数,请参阅 Gilles 的回答。除非我错过了手册页中的某些内容,否则这对于使用密码短语
puttygen
生成 OpenSSH 密钥来说毫无意义。我个人会使用,并希望在制作密钥时没有人看到。据我所知,您也不能使用它来更改密钥文件中的注释。ssh-keygen
puttygen
提供密码的方式是使用
-N
:当然你应该
input
为变量提供像你这样的内容: