SSH 免密登录

SSH 免密登录允许你通过密钥对(而非密码)安全地自动登录到远程服务器。

工作原理:密钥对认证

SSH 免密登录的核心是非对称加密。它使用一对密钥:

私钥:相当于你的家门钥匙。你必须绝对保密,存放在本地客户端机器上(通常是你的个人电脑)。

公钥:相当于一把公开的锁。你可以把它交给任何你想访问的服务器。

认证流程

客户端(你的电脑)向服务器发起连接,并告知自己想用哪个密钥对登录。

服务器生成一段随机字符串,用你事先存放在服务器上的公钥进行加密,然后发送给客户端。

客户端收到加密的字符串后,用本地的私钥进行解密。

客户端将解密后的字符串发送回服务器。

服务器验证发回来的字符串是否与最初生成的一致。如果一致,说明客户端拥有正确的私钥,认证通过,允许登录。

因为只有拥有私钥的你才能完成这个挑战,所以无需输入密码,且非常安全。

详细配置步骤

假设你有两台机器:

本地机器(客户端):你正在使用的电脑(例如:你的笔记本电脑,系统为 MacOS 或 Linux/WSL)。

远程机器(服务器):你想登录的服务器(例如:一台云服务器,IP 为 123.123.123.123,用户名为 root)。

步骤 1:在本地机器生成密钥对

如果你的本地机器上还没有 SSH 密钥对(或者你想为这个服务器专门创建一个),你需要先生成它。

打开你的终端(Terminal)。

输入以下命令来生成密钥对:

1
2
3
4
5
ssh-keygen -t ed25519 -C "your_email@example.com"
-t 
# ed25519:指定密钥类型。ed25519 是目前最推荐的类型,它更安全、更快。如果你的系统过于老旧不支持,可以使用 -t rsa -b 4096。

# -C "your_email@example.com":一个注释,通常用你的邮箱,方便标识这个密钥的拥有者。这不是必须的。

接下来,终端会提示你一些问题:

1
2
3
Enter file in which to save the key (/home/your_username/.ssh/id_ed25519): 直接按回车,使用默认路径。

Enter passphrase (empty for no passphrase): 这里强烈建议为你的私钥设置一个密码短语。这相当于为你的“家门钥匙”加了一个密码,即使私钥文件被盗,对方也无法使用。如果图方便,可以直接回车留空(不推荐)。

然后会让你再输入一次密码短语进行确认。

生成成功后,你会在 ~/.ssh/ 目录下看到两个新文件:

id_ed25519:这是你的私钥,绝不能泄露。

id_ed25519.pub:这是你的公钥,可以随意分发。

步骤 2:将公钥上传到远程服务器

现在,你需要把“公开的锁”(公钥)安装到远程服务器的“门”上。

方法 A:使用 ssh-copy-id 命令(最简单、最推荐)

在本地机器的终端中执行:

1
2
3
4
ssh-copy-id -i ~/.ssh/id_ed25519.pub root@123.123.123.123
# -i ~/.ssh/id_ed25519.pub:指定你要上传的公钥文件路径。如果你用的是默认的 RSA 密钥(id_rsa.pub),这里需要相应修改。

root@123.123.123.123:你的远程服务器用户名和地址。

这个命令会自动用密码登录到远程服务器。

将你的公钥内容追加到远程服务器上 ~/.ssh/authorized_keys 文件的末尾。

设置好正确的文件权限。

执行后,它会提示你输入 root 用户的密码。输入正确后,公钥就上传成功了。

方法 B:手动复制(如果 ssh-copy-id 不可用)

在本地机器上,查看并复制你的公钥内容:

1
cat ~/.ssh/id_ed25519.pub

用鼠标全选终端里显示的全部内容(通常以 ssh-ed25519 AAAA… 开头,以你的邮箱注释结尾),并复制。

登录到远程服务器(这次还是需要密码):

1
2
ssh root@123.123.123.123
在远程服务器上,确保 ~/.ssh 目录存在,并进入该目录:
1
2
3
mkdir -p ~/.ssh
cd ~/.ssh
将你复制的公钥内容追加到 authorized_keys 文件中:
1
2
echo "你复制的公钥内容" >> authorized_keys
(注意是 >> 追加,不是 > 覆盖!)

设置正确的权限(非常重要,权限不对 SSH 会拒绝工作):

1
2
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

退出远程服务器的登录:

1
exit

步骤 3:测试免密登录

现在,一切就绪。从你的本地机器再次尝试登录:

1
ssh root@123.123.123.123

如果配置正确,你会:

  1. 如果设置了私钥密码短语,它会提示你输入私钥的密码短语(不是服务器用户的密码)。

  2. 如果没设置私钥密码短语,它会直接登录成功,不再询问任何密码。

恭喜你,SSH 免密登录配置成功!

故障排查

如果登录失败,被要求输入密码,请检查以下几点:

  1. 文件路径和权限:这是最常见的问题。

在远程服务器上,确保:

~/.ssh 目录权限是 700 (drwx——)

~/.ssh/authorized_keys 文件权限是 600 (-rw——-)

~ 目录不能有写权限给 group 和 others(最好设置为 755)。

  1. 公钥内容是否正确:

检查远程服务器的 ~/.ssh/authorized_keys 文件,确保你的公钥完整地在一行内,没有换行或多余空格。

  1. SSH 服务端配置:

极少数情况下,服务器可能禁用了密钥认证。检查 /etc/ssh/sshd_config 文件,确保以下行没有被注释掉或设为 no:

1
2
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys

修改后需要重启 SSH 服务:systemctl restart sshd。

使用 -v 参数调试:

在连接时添加 -v(verbose)参数,可以输出详细的连接过程,对定位问题非常有帮助。

1
ssh -v root@123.123.123.123

总结

步骤 操作位置 核心命令/操作 目标
生成密钥对 本地机器 ssh-keygen -t ed25519 创建你的“钥匙”(私钥)和“锁”(公钥)
上传公钥 本地 -> 远程 ssh-copy-id user@host 把“锁”安装到远程服务器上
测试登录 本地机器 ssh user@host 验证用“钥匙”能否直接开门
(可选)排查 远程服务器 检查权限、文件内容 解决配置失败的问题
Licensed under CC BY-NC-SA 4.0
Gear(夕照)的博客。记录开发、生活,以及一些不足为道的思考……