原理
配置SSH免密登录基于公私钥加密机制,非对称加密使用一对密钥,即公钥和私钥。公钥用于加密数据,私钥用于解密数据。这两个密钥在数学上相关,但从公钥难以推导出私钥。,其原理如下:
1. 生成公私钥对
在客户端执行 ssh - keygen 命令时,会生成一对密钥:公钥(public key)和私钥(private key) 。这对密钥是基于特定的加密算法(如RSA、ED25519等)生成的,具有唯一性且相互关联。公钥可以公开给任何人,而私钥则必须严格保密。
2. 公钥分发
将客户端生成的公钥复制到服务器上,一般存放在服务器用户主目录下的 ~/.ssh/authorized_keys 文件中。这个过程就像是告诉服务器:"以后持有与这个公钥配对私钥的客户端都可以免密登录。"
3. 登录验证
当客户端尝试登录服务器时:
- 客户端操作:客户端发起SSH连接请求,并使用自己的私钥对一个随机数(通常由服务器发送)进行加密,生成一个签名。然后将这个签名以及客户端的公钥发送给服务器。
- 服务器验证 :服务器收到客户端发送的信息后,在
authorized_keys文件中查找客户端的公钥。如果找到匹配的公钥,就使用该公钥对收到的签名进行解密。由于公钥和私钥是配对的,只有使用对应的私钥加密的数据才能被该公钥成功解密。如果解密后的随机数与服务器最初发送的随机数一致,服务器就认为客户端拥有正确的私钥,验证通过,允许客户端免密登录。
整个过程中,私钥始终保存在客户端本地,没有在网络中传输,公钥虽然在网络上传输,但它只能用于加密数据,无法用于解密数据,所以即使公钥被截获,攻击者没有私钥也无法冒充客户端登录服务器,从而保证了免密登录的安全性。
总结
- 客户端生成公私钥对 :客户端执行
ssh-keygen命令生成唯一的公私钥对。私钥保存在客户端本地,公钥将被发送到服务端。 - 公钥分发至服务端 :通过
ssh-copy-id或手动方式将公钥复制到服务端的~/.ssh/authorized_keys文件。这相当于服务端记录下了客户端的"身份标识"。 - 客户端发起连接请求:客户端向服务端发起 SSH 连接请求。
- 服务端发起挑战:服务端收到请求后,会生成一个随机字符串,作为挑战信息发送给客户端。
- 客户端回应挑战:客户端收到挑战信息后,使用本地的私钥对这个随机字符串进行加密,生成签名,并将签名和公钥一起发送回服务端。这里使用私钥加密,只有对应的公钥才能解密,以此证明客户端拥有私钥。
- 服务端验证签名 :服务端收到客户端发送的签名和公钥后,在
authorized_keys文件中查找匹配的公钥。如果找到,就使用该公钥对签名进行解密。由于公钥与私钥的配对关系,只有用对应的私钥加密的数据,才能被该公钥正确解密。如果解密后的内容与之前发出的随机字符串一致,服务端就确认客户端持有与公钥匹配的私钥,验证通过,允许客户端免密登录。
整个过程中,私钥始终安全保存在客户端本地,公钥虽在网络传输但无法用于解密,即便被截获也不影响安全性。这就是为什么把公钥复制到服务端后客户端就能免密访问服务端的原因。
配置SSH免密登录使用公私钥
以下以Linux系统为例,讲解如何配置SSH免密登录使用公私钥:
- 生成公私钥对
ssh - keygen -t rsa - ssh - keygen -t rsa
1. 生成公私钥对
在客户端主机上执行以下命令生成密钥对,一般使用rsa算法,你也可以选择其他如ed25519等。
bash
ssh - keygen -t rsa
执行上述命令后,会提示你输入保存密钥的文件名和密码(可以直接回车留空,这样后续登录时就无需输入密码,但如果设置了密码,登录时还是需要输入此密码来解锁私钥)。
2. 复制公钥到服务器
将生成的公钥复制到目标服务器,有两种常见方法:
方法一:使用 ssh - copy - id 命令(如果系统安装了此工具)
bash
ssh - copy - id user@server_ip
这里user是你在服务器上的用户名,server_ip是服务器的IP地址。执行此命令后,会提示输入服务器的密码,输入后公钥就会被复制到服务器的~/.ssh/authorized_keys文件中。
方法二:手动复制
首先在客户端找到公钥文件,默认路径为~/.ssh/id_rsa.pub,然后将其内容复制到服务器的~/.ssh/authorized_keys文件中。
bash
# 在客户端获取公钥内容
cat ~/.ssh/id_rsa.pub
# 在服务器上创建或编辑 authorized_keys 文件
vim ~/.ssh/authorized_keys
# 将客户端公钥内容粘贴到 authorized_keys 文件中
多个客户端情况
每个客户端的公钥内容追加到 ~/.ssh/authorized_keys 文件中,每个公钥占一行
3. 配置服务器权限
确保服务器上的~/.ssh目录和authorized_keys文件权限正确。
bash
# 设置.ssh目录权限
chmod 700 ~/.ssh
# 设置 authorized_keys 文件权限
chmod 600 ~/.ssh/authorized_keys
配置完成后,你就可以在客户端使用ssh user@server_ip命令尝试免密登录到服务器了。