公钥和私钥如何在客户端和服务器上存储和关联?

公钥和私钥如何在客户端和服务器上存储和关联?

我尝试匹配客户端和服务器上的公钥和私钥以及配置文件,但无法解决不匹配的问题。我可以通过 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.pubMac 上的密钥。

如果相等但仍然无法登录,则说明有其他问题。

答案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 总是这样放置它们。

相关内容