known_hosts实际上是什么?

cad*_*alt 34 ssh

.ssh在我跑之前我没有目录

ssh user@foo.com

这创建了一个带有一个文件的.ssh目录known_hosts.

它有一些这样的文字.

foo.com,107.180.00.00 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAuJfqSnraBz//Ux4j/hZpLv2eYUxNUgCk+9ClqoSgfcu4vXbWtUGSjo75UVQf+uguOeBnRLppJJ3mt0R5c/PPcawUGWfffk33t+biYcqra9xUcyfiGtO/Icko2L1J0EYTXM/8x8VK6UYFMfad2gltnZRa8Am50oHTXot1Df0RljUBxvh/UhmTJUrODpyrl2xY1OMWjM+S6uYCMNeSQGEpNfsWiCIStRnctMZSxiYJOLTSC4F2GF7B8pYFBn5rSwVHp17WCdO+4BZfwvH3HSSH8IWoyFhki+NlG912SEBJXcryvc0JPfAB9DTB4mRImjgrRT8vz5QeaCDrh8k4/A+U1fff
Run Code Online (Sandbox Code Playgroud)

我认为这可能是公共或私人密钥拉出我的服务器的一些方法,但事实并非如此.

这是什么,它用于什么?

我只是想了解更多有关ssh及其工作原理的信息.例如,在这种情况下,我没有在本地计算机上设置私钥,因此它提示输入密码.

研究

根据它,它假设是服务器的公钥

https://security.stackexchange.com/questions/20706/what-is-the-difference-between-authorized-key-and-known-host-file-for-ssh

Cas*_*iel 18

这个文件实际上是您的个人证书颁发机构.它是您确定的所有SSH服务器主机密钥的列表是准确的.known_hosts中的每个条目都是一个包含三个或更多空格分隔字段的大行,如下所示:

一个.一个或多个服务器名称或IP地址,以逗号连接在一起.

foo.com,107.180.00.00

湾 钥匙的类型.

ssh-rsa

C.公钥数据本身编码为保持在ASCII范围内.

AAAAB3NzaC1yc2EAAAABIwAAAQEAuJfqSnraBz//Ux4j/hZpLv2eYUxNUgCk+9ClqoSgfcu4vXbWtUGSjo75UVQf+uguOeBnRLppJJ3mt0R5c/PPcawUGWfffk33t+biYcqra9xUcyfiGtO/Icko2L1J0EYTXM/8x8VK6UYFMfad2gltnZRa8Am50oHTXot1Df0RljUBxvh/UhmTJUrODpyrl2xY1OMWjM+S6uYCMNeSQGEpNfsWiCIStRnctMZSxiYJOLTSC4F2GF7B8pYFBn5rSwVHp17WCdO+4BZfwvH3HSSH8IWoyFhki+NlG912SEBJXcryvc0JPfAB9DTB4mRImjgrRT8vz5QeaCDrh8k4/A+U1fff

d.任何可选的评论数据.

也!!这个帖子可能对你有用:

https://security.stackexchange.com/a/20710

  • 但它从哪里获得这个公钥? (3认同)
  • @cadegalt,“sshd”具有多个不同的密钥,用于与“ssh”客户端进行安全通信。我认为在每种特定情况下,它都会选择客户端支持的最_安全_的一个。在连接初始化期间发送到客户端的公钥可以是位于目录“/etc/ssh”中的“*.pub”文件中的任何公钥。您可以使用命令“find /etc/ssh -name '*.pub'”来枚举它们。或者您可以使用 `find /etc/ssh -name '*.pub' -print -exec cat {} \; 查看这些文件的内容 -exec 回显\;`。 (2认同)
  • @VictorYarema 你是对的,我的错误。我应该说服务器的公钥位于服务器的“/etc/ssh/*.pub”上 (2认同)

cmi*_*idi 5

要添加到上面的答案和您的评论中,ssh会话有四个构建基块

  1. 加密(每个会话交换密钥后获得对称密钥)
  2. 数据完整性(使用例如SHA,HMAC的MAC)
  3. 密钥交换方法
  4. 公钥方法或主机密钥方法

SSH算法协商涉及密钥交换状态机,该状态机在发送SSH_MSG_KEXINIT消息以及算法列表时开始。

密钥交换方法或简称为kex指定用于加密的会话密钥和发送到客户端的主机身份验证主机公共密钥(ssh-rsassh-dss..)。以下步骤是使用Diffie hellman密钥交换算法对kex进行的基本步骤

引用RFC https://tools.ietf.org/html/rfc4253

以下步骤用于交换密钥。在这种情况下,C是客户端;S是服务器;p是一个大的安全素数;g是GF(p)子组的生成器;q是子组的顺序;V_S是S的标识字符串;V_C是C的标识字符串;K_S是S的公共主机密钥;I_C是C的SSH_MSG_KEXINIT消息,而I_S是S的SSH_MSG_KEXINIT消息,在此部分开始之前已进行了交换。

  1. C生成一个随机数x(1 <x <q)并计算e = g ^ x mod p。C将e发送给S。

  2. S生成一个随机数y(0 <y <q)并计算f = g ^ y mod p。S接收e。它计算K = e ^ y mod p,H =哈希(V_C || V_S || I_C || I_S || K_S || e || f || K)(这些元素根据其类型进行编码;请参见下文) ,并使用其专用主机密钥在H上签名。S将(K_S || f || s)发送给C。签名操作可能涉及第二个哈希操作。

  3. C验证K_S确实是S的主机密钥(例如,使用证书或本地数据库)。C也被允许接受未经验证的密钥;但是,这样做会使协议对主动攻击不安全(但在许多环境中,出于实际原因,短期内可能需要这样做)。C然后计算K = f ^ x mod p,H = hash(V_C || V_S || I_C || I_S || K_S || e || f || K),并验证H上的签名s。

在某些系统中,第三步中提到的本地数据库可以是.ssh / known_hosts文件。因此,为回答您的问题,主机在密钥交换期间将公钥发送给客户端。

当前定义了以下公共密钥和/或证书格式:

ssh-dss必需签署原始DSS密钥

ssh-rsa推荐签名Raw RSA Key

pgp-sign-rsa可选符号OpenPGP证书(RSA密钥)

pgp-sign-dss可选符号OpenPGP证书(DSS密钥)