的ssh-keygen产生以下输出:
The key fingerprint is:
dd:e7:25:b3:e2:5b:d9:f0:25:28:9d:50:a2:c9:44:97 user@machine
The key's randomart image is:
+--[ RSA 2048]----+
| .o o.. |
| o +Eo |
| + . |
| . + o |
| S o = * o|
| . o @.|
| . = o|
| . o |
| o. |
+-----------------+
Run Code Online (Sandbox Code Playgroud)
此图像的目的是什么,它是否为用户提供任何价值?请注意,这是客户端(用户)密钥,而不是主机密钥。
具体来说,为什么 ssh Ed25519 公钥的前 25 个字符总是相同的?
例如,如果我用 制作 5 个键ssh-keygen -o -a 100 -t ed25519,前 25 个字符总是AAAAC3NzaC1lZDI1NTE5AAAAI.
我认为这是某种序言或标题,但我很想知道实际答案。
有没有办法将现有的 OpenSSH 密钥对转换为 SSH2(ssh.com 格式)密钥对?
UPD:因为有一些关于ssh-keygen突然出现的答案,我会解释我来自哪里(这也是“你试过什么?”的一个很好的答案)。
$> diff --report-identical-files <(ssh-keygen -e -f ~/.ssh/id_dsa) <(ssh-keygen -e -f ~/.ssh/id_dsa.pub)
Files /tmp/zshAGGWAK and /tmp/zshPZiIr6 are identical
Run Code Online (Sandbox Code Playgroud)
换句话说,ssh-keygen为私有和公共输入密钥返回相同的密钥(原始文件的哈希值明显不同,我已经检查了两次以确保它们是有效的私有密钥和公共密钥)。似乎ssh-keygen只为私人或公共输入密钥生成公钥。
我做错了还是正常行为?
我尝试通过传递 hostnamses 列表来找到一个脚本来解密(unhash) known_hosts 文件中的 ssh 主机名。
所以,完全相反:
ssh-keygen -H -f known_hosts
Run Code Online (Sandbox Code Playgroud)
或者,如果 ssh 配置 HashKnownHosts 设置为 No,则执行与此相同的操作:
ssh-keygen -R know-host.com -f known_hosts
ssh-keyscan -H know-host.com >> known_hosts
Run Code Online (Sandbox Code Playgroud)
但无需重新下载主机密钥(由 ssh-keyscan 引起)。
就像是:
ssh-keygen --decrypt -f known_hosts --hostnames hostnames.txt
Run Code Online (Sandbox Code Playgroud)
其中 hostnames.txt 包含主机名列表。
我有一台运行 debian sid 的新机器,我在上面生成了一个新的 ssh 密钥对。我想找到一种方便的方法,使用我的旧 Ubuntu 机器及其密钥对将这个新密钥对复制到其他各种机器。我已禁用所有“远程”计算机的密码登录,因此我想使用旧计算机作为中间设备。在研究这个问题时,我发现了的手册页中作为示例ssh-copy-id给出的确切情况。我按照示例访问 pi 零 running pihole,但在帖子标题中出现错误。
总结该示例中的步骤,debian具有新密钥对的计算机在哪里,sarp.lan具有旧密钥对的计算机在哪里,并且pihole是“远程”计算机,我做了:

但是,运行时ssh -v pihole,我确实看到了输出
debug1: Server accepts key: /home/sarp/.ssh/id_rsa RSA SHA256:V74Y4EhlszaIzco6oxOtl86ALj/U8rhXO2XUpEftZLU agent
Run Code Online (Sandbox Code Playgroud)
我阅读了有关该主题的各种帖子,但没有一个解决方案适合我。以下是我尝试过的一些细节/事情:
.ssh/
echo $SSH_AUTH_SOCKreturns /tmp/ssh-a8Ol5O0XY9Fv/agent.1326,并且我没有看到 keyring 守护进程正在运行ps aux。ssh-add -l正确显示第一张图片中可以看到的两个按键(一个来自旧机器,另一个来自新机器).ssh/config从旧机器复制了,所以主机名/用户名/等。应该没事。让我知道我是否应该提供额外的有用信息,如果这是非常明显的事情,我深表歉意,但我在这里错过了什么?
我从下面的 Dockerfile 构建容器:
FROM ubuntu:14.04
...
RUN apt-get update && apt-get install -y vim
#RUN ssh-keygen -f /root/.ssh/id_rsa -N strongpass123$%^
RUN ssh-keygen -f /root/.ssh/id_rsa
...
Run Code Online (Sandbox Code Playgroud)
我很少这样做,但是在使用之前ssh-keygen和之后有很多命令。
我知道我可以从脚本开始docker exec -it thirsty_darwin sh script.sh,然后标记图像,然后使用容器(图像)链接,但这并不是我想要的清晰解决方案。
甚至最坏的情况是ssh-add ~/.ssh/id_rsa当我必须使用 expect 工具时。Expect 工具对我的密码进行了硬编码。我不想做这件事。
当我登录到 SSH 服务器/主机时,我被问到其公钥的哈希值是否正确,如下所示:
# ssh 1.2.3.4
The authenticity of host '[1.2.3.4]:22 ([[1.2.3.4]:22)' can't be established.
RSA key fingerprint is SHA256:CxIuAEc3SZThY9XobrjJIHN61OTItAU0Emz0v/+15wY.
Are you sure you want to continue connecting (yes/no)? no
Host key verification failed.
Run Code Online (Sandbox Code Playgroud)
为了能够比较,我之前在SSH服务器上使用了这个命令,并将结果保存到客户端上的一个文件中:
# ssh-keygen -lf /etc/ssh/ssh_host_rsa_key.pub
2048 f6:bf:4d:d4:bd:d6:f3:da:29:a3:c3:42:96:26:4a:41 /etc/ssh/ssh_host_rsa_key.pub (RSA)
Run Code Online (Sandbox Code Playgroud)
出于某种重要原因(毫无疑问)这些命令中的一个使用了不同的(更新的?)显示哈希的方式,从而极大地帮助了中间人攻击者,因为它需要一个非平凡的转换来比较这些。
我如何比较这两个散列,或者更好:强制一个命令使用另一个的格式?
该-E选项ssh-keygen不可用在服务器上。
我正在尝试向服务器添加公钥,但我不想重新启动 sshd 服务以使其生效。原因是重新启动 ssh 服务似乎对当时可以使用 ssh 服务的其他用户造成破坏。大多数文档建议添加一个公钥$HOME/.ssh/authorized_keys,然后重新启动sshd服务 ( systemctl restart sshd)。感兴趣的操作系统是 Linux。
我的问题是:
sshd需要重启吗?sshd是重启,那个时候有没有服务中断?sshd在添加新公钥后重新启动服务$HOME/.ssh/authorized_keys?我需要添加一个检查,如果主机名已经存在于 known_hosts 中。
通常我会做这样的事情:
ssh-keygen -H -F hostname
Run Code Online (Sandbox Code Playgroud)
但是,在这种特殊情况下,这似乎对我不起作用。我使用端口 2202 连接到主机,如下所示:
ssh user@myhost -p 2102
Run Code Online (Sandbox Code Playgroud)
我要求将主机名添加到 known_hosts,我说是。之后我运行“ssh-keygen -H -F myhost”但收到空结果。更糟糕的是,known_hosts 被散列。
这与端口 22 完美配合,因此如果我登录到“ssh user@myotherhost”,保存已知主机并运行“ssh-keygen -H -F myotherhost”,我会收到文件中的确切行。
那么,如何调整命令以使用端口 2102?
我的系统(Fedora 35)上 ssh-keygen 的手册页显示支持以下类型的密钥:
\n-t dsa | ecdsa | ecdsa-sk | ed25519 | ed25519-sk | rsa\n Specifies the type of key to create. The possible values are\n \xe2\x80\x9cdsa\xe2\x80\x9d, \xe2\x80\x9cecdsa\xe2\x80\x9d, \xe2\x80\x9cecdsa-sk\xe2\x80\x9d, \xe2\x80\x9ced25519\xe2\x80\x9d, \xe2\x80\x9ced25519-sk\xe2\x80\x9d, or \xe2\x80\x9crsa\xe2\x80\x9d.\nRun Code Online (Sandbox Code Playgroud)\n有没有办法在运行时通过向脚本ssh-keygen或其他脚本传递一些特殊标志来查阅此列表?或者这个类型列表是硬编码的并且仅在此手册页中指定?我问这个问题的原因是我想教我的 shell 如何自动完成-t。
ssh ×10
ssh-keygen ×10
sshd ×3
hostname ×2
openssh ×2
docker ×1
encryption ×1
expect ×1
fingerprint ×1
hashsum ×1
linux ×1
puttygen ×1
ssh-agent ×1
ssh2 ×1