【问题标题】:What is actually in known_hosts? [closed]known_hosts 中到底有什么? [关闭]
【发布时间】:2019-03-06 15:33:18
【问题描述】:

在我运行之前我没有.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

我认为这可能是从我的服务器中提取的公钥或私钥,但事实并非如此。

这是什么,有什么用途?

我只是想了解更多关于 ssh 及其工作原理的信息。例如在这种情况下,我没有在本地机器上设置私钥,所以它按预期提示输入密码。

研究

根据

假设它是服务器的公钥

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

【问题讨论】:

  • 但事实并非如此。 你为什么这么想?您是否阅读了sshd(8) 的手册页,其中包含该文件的描述和格式?

标签: ssh


【解决方案1】:

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

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

foo.com,107.180.00.00

b.键的类型。

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

【讨论】:

  • 但是它从哪里得到这个公钥呢?
  • @cadegalt,服务器通常会自行生成主机密钥并写入/etc/ssh/ssh_host_rsa_key
  • @wisbucky,你提到的文件DOESN'T包含public key!
  • @cadegalt,sshd 有多个不同的密钥,用于与ssh 客户端的安全通信。我想在每种特定情况下,它都会选择客户端支持的最安全。在连接初始化期间发送到客户端的公钥可以是位于目录/etc/ssh 中的*.pub 文件中的任何公钥。您可以使用命令find /etc/ssh -name '*.pub' 枚举那些。或者您可以使用find /etc/ssh -name '*.pub' -print -exec cat {} \; -exec echo \; 查看这些文件的内容。
  • @VictorYarema 你是对的,我的错。我应该说服务器的公钥在服务器的/etc/ssh/*.pub
【解决方案2】:

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

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

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

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

引用 RFC https://www.rfc-editor.org/rfc/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
  1. S 生成一个随机数 y (0
  1. C 验证 K_S 确实是 S 的主机密钥(例如,使用 证书或本地数据库)。 C也允许接受 密钥未经验证;但是,这样做会使 协议对主动攻击不安全(但对于 在许多环境中短期内的实际原因)。 C 然后 计算 K = f^x mod p, H = hash(V_C || V_S || I_C || I_S || K_S ||电子||女 || K),并验证 H 上的签名 s。

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

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

ssh-dss 需要签名原始 DSS 密钥

ssh-rsa 推荐签名原始 RSA 密钥

pgp-sign-rsa 可选签名 OpenPGP 证书(RSA 密钥)

pgp-sign-dss 可选签名 OpenPGP 证书(DSS 密钥)

【讨论】:

  • 长话短说,我不必随时生成此密钥,它是通过您发布的链接指定的协议完成的?
  • 是的,如果你是ssh客户端,你不需要生成主机密钥
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-23
  • 2015-11-04
  • 2020-11-01
  • 2013-02-14
相关资源
最近更新 更多