从SSH握手过程解释http://www.cathaycenturies.com/blog/?p=1635
密钥交换
- 客户端有公钥和私钥对。服务器有公钥和私钥对。
- 客户端和服务器交换它们的公钥。
- 客户端现在拥有自己的密钥对以及服务器的公钥。
- 服务器现在拥有自己的密钥对以及客户端的公钥。
- 这种密钥交换是通过不安全的网络完成的。
- 客户端获取其私钥和服务器的公钥,并将其通过数学方程式传递以生成共享秘密(会话密钥)。
- 服务器获取其私钥和客户端的公钥,并将其通过数学方程传递以产生共享秘密(会话密钥)。这两个共享的秘密是相同的!这是一个非对称密钥。
- 此加密隧道用于会话的其余部分,包括下一阶段:用户身份验证。
服务器和客户端之间的公钥交换是否在以下所有会话中完成一次,直到它们被更改?
每个会话在客户端和服务器上生成一次会话密钥吗?
每次生成它们时,它们都会将私钥和公钥作为输入。这是否意味着只要私钥和公钥保持相同,不同会话的会话密钥就相同?
为什么引用说同一会话中服务器和客户端上生成的会话密钥是“相同的”?
项目符号 8 似乎是说用户身份验证发生在会话密钥生成之后?
如果是,那么用户身份验证是否使用客户端和服务器上生成的会话密钥,还是仅使用客户端和服务器上的公钥和私钥?
顺便问一下,是否有一些关于该过程如何进行以及如何使用服务器和客户端上的公钥和私钥以及会话密钥的参考?
谢谢。
答案1
- 服务器和客户端之间的公钥交换是否在以下所有会话中完成一次,直到它们被更改?
是的。每次密钥交换时,密钥交换的密钥都会发生变化。
- 每个会话在客户端和服务器上生成一次会话密钥吗?
是的。除非您传输大量数据,否则您的会话会持续足够长的时间,或者您强制重新生成密钥(或将重新生成密钥配置为比需要的更频繁)。RekeyLimit
服务器和客户端配置中的选项。
每次生成它们时,它们都会将私钥和公钥作为输入。这是否意味着只要私钥和公钥保持相同,不同会话的会话密钥就相同?
如上。这些密钥是仅为密钥交换而生成的。它们不是前面问题中讨论的身份验证密钥也不是主机密钥。
- 为什么引用说同一会话中服务器和客户端上生成的会话密钥是“相同的”?
这是密钥交换的要点。我真的很喜欢下面这张解释它的图片(来自维基百科)。它们是根据每个私钥的知识独立生成的,但通过网络传输的数据(公钥)不足以构建这个共享秘密。
- 项目符号 8 似乎是说用户身份验证发生在会话密钥生成之后?
如果是,那么用户身份验证是否使用客户端和服务器上生成的会话密钥,还是仅使用客户端和服务器上的公钥和私钥?
不会。会话密钥用于对网络上的通道进行加密。关键是,在密钥交换之前,数据在网络上传输是不安全的,任何人都可以拦截/修改/插入任何数据。密钥交换后,使用密码对数据进行加密,并使用 MAC 进行“身份验证”。
有很多关于 SSH 协议的信息。 OpenSSH 项目有一个专门的页符合 SSH 协议实施的所有标准 (RFC)。也许最重要的是RFC4253。 openssh的源代码也可以解释很多。
我希望我说得更清楚一点。如果有什么遗漏,请告诉我。