工作原理:密钥对认证
SSH 免密登录的核心是非对称加密。它使用一对密钥:
私钥:相当于你的家门钥匙。你必须绝对保密,存放在本地客户端机器上(通常是你的个人电脑)。
公钥:相当于一把公开的锁。你可以把它交给任何你想访问的服务器。
认证流程
客户端(你的电脑)向服务器发起连接,并告知自己想用哪个密钥对登录。
服务器生成一段随机字符串,用你事先存放在服务器上的公钥进行加密,然后发送给客户端。
客户端收到加密的字符串后,用本地的私钥进行解密。
客户端将解密后的字符串发送回服务器。
服务器验证发回来的字符串是否与最初生成的一致。如果一致,说明客户端拥有正确的私钥,认证通过,允许登录。
因为只有拥有私钥的你才能完成这个挑战,所以无需输入密码,且非常安全。
详细配置步骤
假设你有两台机器:
本地机器(客户端):你正在使用的电脑(例如:你的笔记本电脑,系统为 MacOS 或 Linux/WSL)。
远程机器(服务器):你想登录的服务器(例如:一台云服务器,IP 为 123.123.123.123,用户名为 root)。
步骤 1:在本地机器生成密钥对
如果你的本地机器上还没有 SSH 密钥对(或者你想为这个服务器专门创建一个),你需要先生成它。
打开你的终端(Terminal)。
输入以下命令来生成密钥对:
|
|
接下来,终端会提示你一些问题:
|
|
然后会让你再输入一次密码短语进行确认。
生成成功后,你会在 ~/.ssh/ 目录下看到两个新文件:
id_ed25519:这是你的私钥,绝不能泄露。
id_ed25519.pub:这是你的公钥,可以随意分发。
步骤 2:将公钥上传到远程服务器
现在,你需要把“公开的锁”(公钥)安装到远程服务器的“门”上。
方法 A:使用 ssh-copy-id 命令(最简单、最推荐)
在本地机器的终端中执行:
|
|
这个命令会自动用密码登录到远程服务器。
将你的公钥内容追加到远程服务器上 ~/.ssh/authorized_keys 文件的末尾。
设置好正确的文件权限。
执行后,它会提示你输入 root 用户的密码。输入正确后,公钥就上传成功了。
方法 B:手动复制(如果 ssh-copy-id 不可用)
在本地机器上,查看并复制你的公钥内容:
|
|
用鼠标全选终端里显示的全部内容(通常以 ssh-ed25519 AAAA… 开头,以你的邮箱注释结尾),并复制。
登录到远程服务器(这次还是需要密码):
|
|
|
|
|
|
设置正确的权限(非常重要,权限不对 SSH 会拒绝工作):
|
|
退出远程服务器的登录:
|
|
步骤 3:测试免密登录
现在,一切就绪。从你的本地机器再次尝试登录:
|
|
如果配置正确,你会:
-
如果设置了私钥密码短语,它会提示你输入私钥的密码短语(不是服务器用户的密码)。
-
如果没设置私钥密码短语,它会直接登录成功,不再询问任何密码。
恭喜你,SSH 免密登录配置成功!
故障排查
如果登录失败,被要求输入密码,请检查以下几点:
- 文件路径和权限:这是最常见的问题。
在远程服务器上,确保:
~/.ssh 目录权限是 700 (drwx——)
~/.ssh/authorized_keys 文件权限是 600 (-rw——-)
~ 目录不能有写权限给 group 和 others(最好设置为 755)。
- 公钥内容是否正确:
检查远程服务器的 ~/.ssh/authorized_keys 文件,确保你的公钥完整地在一行内,没有换行或多余空格。
- SSH 服务端配置:
极少数情况下,服务器可能禁用了密钥认证。检查 /etc/ssh/sshd_config 文件,确保以下行没有被注释掉或设为 no:
|
|
修改后需要重启 SSH 服务:systemctl restart sshd。
使用 -v 参数调试:
在连接时添加 -v(verbose)参数,可以输出详细的连接过程,对定位问题非常有帮助。
|
|
总结
| 步骤 | 操作位置 | 核心命令/操作 | 目标 |
|---|---|---|---|
| 生成密钥对 | 本地机器 | ssh-keygen -t ed25519 | 创建你的“钥匙”(私钥)和“锁”(公钥) |
| 上传公钥 | 本地 -> 远程 | ssh-copy-id user@host | 把“锁”安装到远程服务器上 |
| 测试登录 | 本地机器 | ssh user@host | 验证用“钥匙”能否直接开门 |
| (可选)排查 | 远程服务器 | 检查权限、文件内容 | 解决配置失败的问题 |