在执行密钥协商时,ssh到底发送什么?


10

当显式指定身份文件给ssh时:

ssh -i ./id_rsa ...

我在ssh调试跟踪中有以下几行:

debug1: Offering public key: ./id_rsa
debug3: send_pubkey_test
debug2: we sent a publickey packet, wait for reply

这是否意味着ssh-generation也id_rsa包含公共RSA指数?id_rsa格式似乎非常明确,因为它包含带有“ BEGIN PRIVATE KEY”块的私钥,因此“提供公钥”必须表示除“将公钥发送给服务器”之外的其他含义。

编辑:

为了澄清,我想知道“提供公共密钥”行后面到底发生了什么。如果客户端拥有多个密钥,则将它们全部一一提供给服务器。


为了解决这个问题,服务器需要一种方法来检查挑战之前我们是否掌握了正确的密钥。因为我已经有一个服务器在解密它之前就拒绝了我们的密钥。由于名称未正确指定而出现错误的地方。
Gopoi 2010年

Answers:


12

为了连接到SSH服务器并使用您的公用/专用密钥对进行身份验证,您必须首先与服务器共享公用密钥。

这是通过复制你的私钥到服务器的公钥,并将它添加到完成~/ssh/authorized_keys通过复制或者/粘贴,复制id_rsa.pub~/.ssh/authorized_keys服务器上或者cat id_rsa.pub >> ~/.ssh/authorized_keys,将其附加到列表中。

当您连接时,服务器使用您的公钥对挑战进行签名,而客户端使用您的私钥id_rsa来对挑战进行解密,并使用服务器的公钥对其进行重新加密,host key然后将其发送回去。

主机通过使用私钥对响应进行解密来验证您是否已对挑战进行了正确解密,并且客户端/主机基于共享数据而不是基于公钥/私钥建立了加密连接。

交换中的NO POINT处是您的私钥,或者是彼此交换或透露的主机的私钥。您的公共密钥存储在服务器上,但这就是为什么它是PUBLIC密钥的原因。


是的,这一切都很好,但是这一切都发生服务器确定用于加密挑战的公共密钥之前。我有几把钥匙,它们都是一一被“提供”给服务器的。这到底意味着什么?是的,我意识到私钥并不是真正发送的,我可能应该从问题中完全删除该行。:P
Alex B

当您指定时,ssh -i keyname您正在告诉ssh客户端您计划用来连接服务器的WHICH密钥。如果您~/.ssh/的客户端中有多个键,则不会迭代每个键。它会寻找~/.ssh/id_rsa~/.ssh/id_dsa可能是其他一些编码到客户端的文件名,或者在~/.ssh/config...中为该主机指定了什么密钥。您的客户端没有/提供/服务器的任何密钥。
cpbills 2010年

当您连接时,您的/ client /将从服务器解密质询,然后落入其标准本地私钥列表以加密质询并发送响应。如果质询响应失败,则/ may /移至下一个硬编码的键名,使用/ that /私钥重新加密,然后重试。同样,您的密钥(公用密钥和专用密钥)在登录身份验证时不与服务器共享。
cpbills 2010年

1
哦,我重新阅读了您的评论;主机:使用主机密钥加密挑战,客户端:使用主机发布密钥解密挑战,客户端:使用私钥加密挑战,主机:尝试使用主机中所有列出的公共密钥解密挑战,~/.ssh/authorized_keys知道挑战是什么,它在寻找什么因此,一旦公开密钥将其解锁,它便知道将使用该密钥。
cpbills 2010年

@cpbills,对不起,我忘了提及我从转发的代理中获得了一些密钥,因此提供了多个密钥(即使我指定了身份文件,-vvv日志也显示了所有提供的密钥)。
Alex B 2010年

1

公钥/私钥密码术基于一个非常简单的系统:

你有一个公共密钥,它能够做单向加密的,那就是能够私钥 cryption。然后,可以将公钥提供给世界上的每个人,尽管他们将能够加密您可以使用私钥解密的数据,但没有人能够解密您的加密数据。

因此,您的问题的答案是“您的公钥”。


是的,谢谢,我详细了解了公钥加密的工作原理,但是我想知道SSH协议的细节以及密钥格式。我很想知道它是否将公用指数存储在私钥文件中,还是不?就我所知,“提供公钥”也可能意味着用您的私钥对随机数进行签名,以便服务器可以找到相应的公钥。
亚历克斯·B

是。它的ssh-凯基-y会给你的私有密钥的公共密钥,反向不工作
马特·弗里曼

1

我认为目前不应该发送公钥或私钥。客户端应使用服务器已知的明文私钥来执行加密。主机可以使用公钥解密此消息,知道唯一可以正确加密该消息的是拥有相应私钥的客户端,从而对客户端进行身份验证。

我相信它是Offering public key: ./id_rsa因为它使用私钥(存储在中./id_rsa)对服务器已知的明文执行加密,然后服务器将使用公钥对该密文进行解密并确认其与明文匹配。./id_rsa.pub初始密钥生成后,客户端永远不需要公钥文件。这仅由服务器用于解密。


我怀疑这种情况会发生,但是我想要一些细节(即实际的SSH密钥协商协议)。不知道为什么要投票。
亚历克斯·B

抱歉,我的回答太难了。我不熟悉SSH密钥协商的细节,仅熟悉公钥身份验证中必需的常规协商。对于非特定的答案,我可能会被否决。
Trey Hunner 2010年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.