当明确指定标识文件到ssh时:
ssh -i ./id_rsa ...
我有这些行在sshdebugging跟踪:
debug1: Offering public key: ./id_rsa debug3: send_pubkey_test debug2: we sent a publickey packet, wait for reply
这是否意味着ssh生成的id_rsa包含公共RSA指数? id_rsa格式似乎是相当明确的,它包含带有“BEGIN PRIVATE KEY”块的私钥,因此“提供公钥”必须是“发送公钥到服务器”之外的其他东西。
编辑:
为了澄清,我想知道在“提供公钥”后面究竟发生了什么。 如果客户端拥有多个密钥,那么他们都将被逐一提供给服务器。
要连接到SSH服务器并使用公钥/私钥进行身份validation,您必须先与服务器共享您的公钥。
这是通过将私钥的公钥复制到服务器,然后通过复制/粘贴,将id_rsa.pub到服务器上的~/.ssh/authorized_keys或者使用cat id_rsa.pub >> ~/.ssh/authorized_keys将其添加到~/ssh/authorized_keys来完成的cat id_rsa.pub >> ~/.ssh/authorized_keys ,附加到列表中。
当你连接时,服务器使用你的公钥来签名,你的客户端使用你的私钥id_rsa解密挑战,用服务器的公共host key重新encryption并发回。
主机通过使用其私钥解密您的响应,客户端/主机根据共享数据而不是您的公钥/私钥build立encryption连接,从而validation您是否正确解密了挑战。
在交换中的任何一点都是你的私钥,或者主机的私钥交换或者透露给对方。 你的公钥被存储在服务器上,但这就是为什么它是公钥。
公钥/私钥密码是基于一个非常简单的系统:
你有一个能够进行单向encryption的公钥和一个能够被解密的私钥。 然后公共密钥可以被分配给世界上的每个人,并且没有人能够解密你的encryption数据,尽pipe他们将能够encryption可以用你的私钥解密的数据。
所以你的问题的答案是“你的公钥”。
我不认为这个时候实际上应该是发送公钥或私钥。 客户端应该使用服务器已知的纯文本上的私钥来执行encryption。 主机可以使用公钥解密这个消息,知道唯一可以正确encryption的消息是一个持有相应私钥的客户端,从而validation客户端。
我相信它说Offering public key: ./id_rsa是因为它使用私钥(存储在./id_rsa )对服务器已知的明文执行encryption,然后服务器将使用公钥来解密这个密文,确认它匹配明文。 初始密钥生成后,客户端永远不需要公钥文件./id_rsa.pub 。 这仅被服务器用于解密。