1. 问题:
日常用rsync,从A(客户端)向目标机B(服务器)传输文件时,每传一个文件输一次密码,就很头大大大大大大!
2. 解决方法
将客户端 A 的公钥复制到 服务器B上
说明:
当 A 需要将文件传输到 B 时,A 需要登录到 B 的系统。B 需要验证 A 的身份,为了实现免密登录,将 A 的公钥添加到 B 的 ~/.ssh/authorized_keys
文件中,这样,当 A 使用 SSH 或 SCP 连接到 B 时,B 就可以使用这个公钥来验证 A 的身份,而不需要每次都输入密码。
3. 工作原理
免密传输的核心是使用 SSH 密钥对进行认证。具体步骤如下:
① 生成密钥对:
在客户端生成一对 SSH 密钥(公钥和私钥)。
② 分发公钥:
将生成的公钥复制到目标服务器的 ~/.ssh/authorized_keys 文件中。
③认证过程:
每次连接时,客户端使用私钥进行认证,服务器通过匹配公钥来验证身份,从而实现免密登录。
4. 免密传输实现步骤
4.1 生成 SSH 密钥对:
在A客户端上生成一对公钥和私钥。这对密钥是非对称的,其中公钥用于在服务器上验证客户端的身份,私钥保留在本地。
注:
后期用哪个账号登录传输,就用哪个账号生成密钥
ssh-keygen -t rsa
- 该命令将在
~/.ssh/ 目录下生成两个文件:id_rsa(私钥)和 id_rsa.pub(公钥)
。 - 如果你已经有这个密钥对,直接跳过生成步骤。
4.2将公钥复制到服务器:
将生成的 id_rsa.pub 公钥文件复制到远程服务器的 ~/.ssh/authorized_keys 文件中。可以通过以下命令自动执行:
ssh-copy-id username@remote_host
如下:
$ ssh-copy-id example@192.168.2.110
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/yy/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
example@192.168.2.110's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'example@192.168.2.110'"
and check to make sure that only the key(s) you wanted were added.
- 这会将
id_rsa.pub
的内容追加到服务器上相应用户的~/.ssh/authorized_keys
文件中。 - 如果手动操作,可以直接用 SCP 或其他方式将 id_rsa.pub 的内容复制到远程服务器上。
4.3 修改文件权限:
确保远程服务器的 ~/.ssh 目录及其中的文件权限设置正确:
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
4.4 验证 SSH 免密登录:
完成后,尝试登录服务器时,应该无需输入密码:
ssh username@remote_host
如:ssh 'example@192.168.2.110'
5. 拓展
5.1 SSH(Secure Shell)认证过程
① 版本号协商阶段
客户端和服务器首先协商使用的 SSH 协议版本。客户端向服务器发起连接请求,服务器响应并发送其支持的协议版本号。客户端根据服务器的版本号决定使用的协议版本。
② 密钥和算法协商阶段
双方协商使用的加密算法、压缩算法和消息验证码算法等。通过 Diffie-Hellman 密钥交换算法生成会话密钥,用于后续的数据加密。
③ 认证阶段
SSH 支持两种主要的认证方式:基于账号和口令的验证方式以及基于公钥和私钥的验证方式。
- 基于账号和口令的验证方式
- 客户端发送用户名和加密后的口令到服务器。
- 服务器解密并验证口令是否正确。
- 如果验证通过,允许登录;否则,拒绝连接。
- 基于公钥和私钥的验证方式
- 客户端生成一对公钥和私钥,并将公钥上传到服务器
- 客户端发起连接请求,服务器发送一个随机字符串(质询)给客户端。
- 客户端使用私钥加密质询并发送回服务器。
- 服务器使用存储的公钥解密质询,如果解密结果正确,则认证通过。
④ 会话请求阶段
认证通过后,客户端请求建立会话,服务器响应并确认会话建立。
⑤ 会话交互阶段
会话建立后,客户端和服务器之间的所有数据传输都使用协商好的会话密钥进行加密,确保数据的安全性和完整性。
5.2 ~/.ssh 文件说明:
SSH 文件的不同部分用于管理和验证 SSH 连接
# id_rsa(私钥):
这是用户的私钥文件。私钥是保密的,它用于在 SSH 连接时进行身份验证。
它存储在用户的 ~/.ssh/ 目录下,权限应该是 600(只有文件拥有者有读写权限)。
例如:/home/username/.ssh/id_rsa
# id_rsa.pub(公钥):
这是与 id_rsa 私钥对应的公钥文件。
公钥可以被共享,它用于验证拥有相应私钥的用户。
也存储在用户的 ~/.ssh/ 目录下,权限应该是 644(所有用户都可以读取)。
例如:/home/username/.ssh/id_rsa.pub
# authorized_keys(存放公钥):
这个文件存放了可以访问该用户帐户的所有公钥。
当用户尝试通过 SSH 连接到服务器时,服务器会检查请求中的私钥是否与 authorized_keys 中的公钥匹配,以验证用户身份。
存储在用户的 ~/.ssh/ 目录下,权限应该是 600。
例如:/home/username/.ssh/authorized_keys
# known_hosts(已知主机):
这个文件存储了用户之前连接过的主机的公钥。
当你第一次连接到一个新主机时,主机的公钥会被添加到这个文件中,用于未来的连接验证。
如果主机的公钥发生变化,SSH 会提示可能存在安全风险(如中间人攻击)。
存储在用户的 ~/.ssh/ 目录下,权限通常是 644。
例如:/home/username/.ssh/known_hosts
觉得有用,点赞再走哇!