我尝试匹配客户端和服务器上的公钥和私钥以及配置文件,但无法解决不匹配的问题。我可以通过 ssh 成功连接到服务器尽管不匹配的情况。这有点令人担忧。
我将准确显示什么内容存储在哪里。
客户端:Mac 服务器:Ubuntu(托管在 AWS 上)
我的本地 mac /Users/sm/.ssh 目录中的文件
ls -la
Sanjays-iMac:.ssh sm$ ls -la
total 24
drwx------ 5 sm staff 160 26 Nov 21:29 .
drwxr-xr-x+ 59 sm staff 1888 26 Nov 21:29 ..
-rw------- 1 sm staff 1696 26 Nov 20:49 id_rsa
-rw-r--r--@ 1 sm staff 451 26 Nov 20:50 id_rsa.pub
-rw-r--r-- 1 sm staff 1151 26 Nov 21:08 known_hosts
我的 ubuntu 服务器上的文件:
ubuntu@ip-172-31-30-19:~/.ssh$ ls -la
total 12
drwx------ 2 ubuntu ubuntu 4096 Nov 26 14:37 .
drwxr-xr-x 8 ubuntu ubuntu 4096 Oct 30 18:02 ..
-rw------- 1 ubuntu ubuntu 391 May 25 2018 authorized_keys
Ubuntu 上的当前工作目录:
ubuntu@ip-172-31-30-19:~/.ssh$ pwd
/home/ubuntu/.ssh
authorized_keys
服务器上的文件内容:
ubuntu@ip-172-31-30-19:~/.ssh$ cat authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAA....0g1bMv+p11K8MDH sanjaydev
(出于隐私原因,内容被截断)
同样,我的本地服务器上有一个known_hosts文件:
Sanjays-iMac:.ssh sm$ cat known_hosts
54.251.104.13 ecdsa-sha2-nistp256 AAAAE2VjZHNhLX..Xsb/RBY=
52.76.85.25 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTI....hAkfLOc5g=
ec2-13-127-241-121.ap-south-1.compute.amazonaws.com,13.127.241.121 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXN....fu5Co4vYB0=
ec2-13-232-81-251.ap-south-1.compute.amazonaws.com,13.232.81.251 ecdsa-sha2-nistp256 AAAAE2VjZHNhL....nhNcRyfu5Co4vYB0=
35.154.168.85 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNo....NcRyfu5Co4vYB0=
13.126.30.42 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTIt....NcRyfu5Co4vYB0=
(出于隐私原因,内容被截断)
现在我的问题是:
什么应该等于什么?
我认为客户端上的公钥应该与authorised_keys
服务器上文件中的条目之一匹配,并且服务器的公钥应该与known_hosts
客户端上文件中的条目之一匹配。
不幸的是,当我手动尝试匹配它们时,它们没有完全匹配(只有前几个字符匹配)。值得注意的是,ssh 连接仍然会在没有-i <pemfile>
在命令行上给出 的情况下进行。
答案1
有两种密钥:服务器或者主持人密钥,向用户标识服务器,以及用户键,允许登录。
服务器的私有主机密钥存储在/etc/ssh/
.相应的公钥会自动添加(在提示后)到known_hosts
客户~/.ssh
端上。这些密钥的目的是检测中间人 (MITM) 攻击:如果您ssh ...
像往常一样键入时主机密钥突然发生变化,并且您知道服务器上没有任何更改,那么您应该感到可疑。
通常您不必关心主机密钥,它们是自动管理的。
用户密钥允许在不输入密码的情况下进行身份验证。用户密钥在客户端上管理:您已经创建了由公钥id_rsa.pub
和私钥组成的密钥对id_rsa
。它们存储在客户端上的~/.ssh
.不使用公钥,它只是存储在那里以供需要时使用。您必须手动将公钥添加到~/.ssh/authorized_keys
服务器上相应用户的公钥。每行一键;如果authorized_keys
文件为空,则副本(例如通过scp
和密码)就id_rsa.pub
足够了。
所以在你的情况下,
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAA....0g1bMv+p11K8MDH sanjaydev
Ubuntu 服务器上的文件中的密钥authorized_keys
必须等于id_rsa.pub
Mac 上的密钥。
如果相等但仍然无法登录,则说明有其他问题。
答案2
按键格式乐趣
从您在其他答案中列出的评论来看,您似乎可能存在关键格式问题。
确实,使用一个标准化程序创建的加密密钥在数学上与另一个标准化程序生成的密钥相同。然而,给定的加密协议需要给定格式的密钥。
转换密钥
- openssl 到 ssh 密钥
以 PEM 格式生成openssl
和输出的密钥可以使用该程序转换为 ssh 格式ssh-keygen
。
ssh-keygen -i -m pem -f key.pem
- SSH 密钥到 PEM
使用 ssh-keygen 生成的密钥可以转换为 PEM 格式:
ssh-keygen -e -m pem -f id_rsa.pub
- PGP 到 ssh 密钥
可以使用以下选项将 GPG 中生成的 PGP 密钥转换为 ssh 格式--export-ssh-key
:
gpg --export-ssh-key <keyid>
按键位置
正如其他答案中所列出的,远程系统需要以 ssh 格式存储在文件中的公钥~/.ssh/authorized_keys
。而本地系统要求私钥为:
- 存储为 id_rsa 中
~/.ssh
或者
ssh -i
使用选件提供
或者
- 使用添加到 ssh 代理
ssh-add
或者
sshcontrol
使用GPG的文件添加到ssh代理
比较公钥
为了比较公钥,这些密钥必须采用相同的格式。否则,即使它们在数学上是相同的对象,键看起来也不会相同。因此,由于您已表明您使用 PEM 格式生成了 ssh 公钥openssl
,因此该公钥可能与存储在服务器文件中的公钥不同~/.ssh/authorized_keys
。
PEM 格式密钥如下所示:
-----BEGIN RSA PUBLIC KEY-----
MIIBCgKCAQEAr/CvdghgkYT1Z38d
...
NlBcCYnrjvfFAj5HQydWc9CfP02rdtCIewIDAQAB
-----END RSA PUBLIC KEY-----
SSH 公钥如下所示:
ssh-rsa AAAAB3N...voZypjC/Y2UFwJie...t20Ih7
PGP 公钥如下所示:
-----BEGIN PGP PUBLIC KEY BLOCK-----
mQENBFN/ZjIBCADad3mv...
...
nE42ZvKt632ZAQ==
=EKbR
-----END PGP PUBLIC KEY BLOCK-----
因此,请确保您比较的是相同格式的密钥。
答案3
来自known_hosts
服务器的 sshd key - in/etc/ssh/*pub
答案4
该authorized_keys
文件应有一行包含 的内容id_rsa.pub
,并且该known_hosts
文件应有一行包含服务器的主机密钥。 (服务器通常将其主机密钥存储在 下的文件中/etc/ssh/
。)
另外,id_rsa
应该在某种意义上匹配,id_rsa.pub
因为它们需要成为密钥对,但除非您手动破坏它,否则 ssh-keygen 总是这样放置它们。