在阅读了有关 SSH 密钥生成和安装的内容后,我对这个想法感到非常困惑,这可能是我从所有信息中错误地收集到的:私钥离开了生成它的系统。
我将阐述我的理解。错误之处请指正:
- 在运行 SSH 服务器的主机上我运行
ssh-keygen
,它会为当前用户生成id-rsa
和。id-rsa.pub
- 当前用户可以通过在#1 中生成的密钥进行验证的远程登录。
- 我
id-rsa
从#1 中取出并将其复制到运行 SSH 客户端的主机的文件系统中。 - 我在 SSH 客户端中注册了#3 中的文件。
这听起来与传统的非对称密钥加密不同,在非对称密钥加密中,私钥永远不会离开进行解密的系统。为什么只有一个私钥,为什么需要同时安装在服务器和客户端上?公钥使用哪种软件:SSH 服务器还是 SSH 客户端?
答案1
您对 ssh 的理解是错误的(而您对公钥/私钥的一般理解是正确的),可能是因为有人在与要使用密钥的机器不同的机器上生成密钥对 - 这种不良做法并不罕见。
ssh-keygen 创建公钥和私钥。
公钥(id_rsa.pub
)被添加到远程系统 - 通常添加到/path/to/userhomedir/.ssh/authorized_keys
文件中 - 每行 1 个公钥。
该id_rsa
文件是您的私钥,不会分发。
id_rsa.pub
可以赠送给任何人并广泛传播。
远程系统不需要用户主目录中的 id_rsa 或 id_rsa.pub 来允许用户登录。只有当它是另一台服务器的客户端时才需要它。在第一次协商后,还有另一组主机密钥(通常在 /etc/ssh 中)用于防止 MITM 攻击,这些密钥通常是自动生成的,您无需担心。
答案2
为什么只有一个私钥,为什么需要同时在服务器和客户端上安装?
首先,它没有需要安装在服务器和客户端上。除了 SSH 客户端系统之外,您无需ssh-keygen
在其他地方运行或复制“私有”id_rsa 文件。
实际上涉及两个私钥 - 一个是您ssh-keygen
刚才生成的“用户”密钥对,另一个是服务器存储在中的“主机”密钥对/etc/ssh
。(主机密钥对是在 SSH 服务器安装时生成的 - 它不是每个用户的。)
但从概念上讲,没有理由说不能只有一个密钥对,因为它们都不用于非对称加密——它们只用于签署:
SSH 流量使用对称算法(例如 AES)进行加密 — 使用 DH 或 ECDH 密钥交换协议为每个连接协商新的对称加密密钥。(此过程中不使用客户端或服务器的非对称密钥;客户端甚至可能根本没有密钥。)
服务器使用其“主机”密钥对向客户端标识自己(这是您第一次连接时要求验证的指纹)并签署先前对称密钥交换的结果。
稍后在用户登录过程中,客户端将使用您的“用户”密钥对通过使用您的私钥进行自己的签名来识别您
id_rsa
,然后服务器根据存储在其证书中的相应公钥进行验证~/.ssh/authorized_keys
。