如果你还在用密码登录你的远程服务器,是时候停下来了。密码登录不仅麻烦,而且在今天这个自动化攻击猖獗的时代,简直就是在给服务器安全“开盲盒”。使用 SSH 密钥对进行身份验证,是一个根本性的安全飞跃的,也是每个开发者和系统管理员都应该掌握的基本功。
这篇指南会带你走完整个流程,从在你自己的电脑上生成密钥,到把它部署到 Ubuntu 服务器,最后彻底关掉密码登录的大门。我会用最直接、最推荐的方式来讲解,确保你一次就能配置成功。
SSH 密钥工作的基本原理
不想听长篇大论的密码学理论?没问题,你只需要记住这几点:
SSH 密钥认证基于非对称加密。你会在你的本地电脑上生成一对密钥:
- 私钥 (Private Key): 这是你的秘密,必须妥善保管,绝对不能泄露。它相当于你的唯一身份证明。
- 公钥 (Public Key): 这是可以公开分享的“锁”。你可以把它放到任何你想要访问的服务器上。
当你尝试连接服务器时,服务器会用你放在上面的公钥(锁)生成一个“挑战”,发给你的电脑。你的电脑用私钥(钥匙)来解开这个挑战,并把答案发回给服务器。服务器一看答案正确,就知道是你本人,于是就放你进去了。整个过程,你的私钥从未离开过你的电脑,非常安全。
为什么推荐 Ed25519 算法?
你可能会看到很多旧教程还在用 RSA 算法。但在今天,Ed25519 是更好的选择。它更现代、更安全,而且性能(尤其在生成和验证签名时)比 RSA 快得多。除非你需要兼容一些非常古老的系统,否则直接用 Ed25519 就对了。
第一步:在本地电脑生成密钥对
打开你本地电脑(无论是 macOS、Linux 还是 Windows 的 WSL)的终端,输入以下命令:
ssh-keygen -t ed25519
这个命令会启动密钥生成程序。
-
保存位置: 程序会问你把密钥保存在哪里。直接按回车键接受默认路径 (
~/.ssh/id_ed25519) 就行。如果你已经有同名密钥,它会提示你是否覆盖,请小心操作。> Generating public/private ed25519 key pair. > Enter file in which to save the key (/home/your_user/.ssh/id_ed25519): -
设置密码短语 (Passphrase): 接下来,它会提示你输入一个密码短语。强烈建议你设置一个!
> Enter passphrase (empty for no passphrase): > Enter same passphrase again:这个密码短语是给你的私钥文件上的一道额外保险。即使你的电脑被黑,私钥文件被偷了,黑客没有这个密码短语也无法使用它。虽然每次连接需要多输入一次,但后面我们会讲到如何用
ssh-agent来解决这个小麻烦。
完成后,你的 ~/.ssh 目录下就会多出两个文件:id_ed25519 (私钥) 和 id_ed25519.pub (公钥)。
第二步:将公钥部署到服务器
现在,我们需要把公钥 (id_ed25519.pub) 的内容放到服务器上。最简单、最不容易出错的方法是使用 ssh-copy-id 命令。
假设你的服务器 IP 地址是 123.45.67.89,你在服务器上的用户名是 sammy,执行:
ssh-copy-id sammy@123.45.67.89
这个工具会自动完成所有事情:
- 通过 SSH 连接到你的服务器(这时会要求你最后一次输入
sammy用户的密码)。 - 在服务器上创建
~/.ssh目录和authorized_keys文件(如果不存在的话)。 - 将你的公钥内容追加到
authorized_keys文件中。 - 设置正确的目录和文件权限(这是手动操作时最容易出错的地方)。
如果你的本地电脑上没有 ssh-copy-id 命令(比如某些版本的 Windows),也可以手动操作:
-
先在本地电脑上获取公钥内容:
cat ~/.ssh/id_ed25519.pub复制输出的整行内容。
-
用密码登录到你的服务器。
-
在服务其上执行以下命令,把刚刚复制的公钥内容粘贴进去:
mkdir -p ~/.ssh && chmod 700 ~/.ssh echo "在这里粘贴你复制的公钥字符串" >> ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys注意
>>是追加,不要写成>,否则会覆盖掉文件里已有的其他密钥。
第三步:测试并彻底禁用密码登录
公钥部署好后,是时候验证一下了。在你的本地终端里,重新连接服务器:
ssh sammy@123.45.67.89
- 如果你设置了密码短语,系统会提示你输入它。
- 如果没有设置,你应该能直接登录成功,不需要输入任何密码。
确认密钥登录没问题后,我们就可以执行最关键的安全步骤:在服务器上禁用密码登录。
-
登录到你的服务器。
-
用
sudo编辑 SSH 服务的配置文件:sudo nano /etc/ssh/sshd_config -
找到
PasswordAuthentication这一行,把它修改为no。它可能被注释掉了(前面有#),记得把#去掉。# ... PasswordAuthentication no # ... -
同时,最好也禁止 root 用户直接通过 SSH 登录。找到
PermitRootLogin并确保它的值是no。PermitRootLogin no -
保存文件并退出 (
Ctrl+X,然后按Y,再按回车)。 -
重启 SSH 服务使配置生效:
sudo systemctl restart ssh
【重要警告】: 在你断开当前的 SSH 连接之前,务必打开一个新的终端窗口,尝试用 SSH 密钥再次登录服务器。确保你还能连上!否则,错误的配置可能会让你被锁在服务器外面。确认新连接没问题后,你就可以放心地关闭所有连接了。从现在起,这台服务器只认你的密钥,不认密码。
SSH 进阶技巧:让工作更流畅
使用 SSH Agent 管理密码短语
每次连接都要输入密码短语确实有点烦。ssh-agent 就是为了解决这个问题而生的。它是一个在后台运行的程序,可以安全地缓存你解密后的私钥。
-
启动 agent:
eval "$(ssh-agent -s)" -
将你的私钥添加到 agent(只需要在每次开机后做一次):
ssh-add ~/.ssh/id_ed25519输入你的密码短语后,在当前终端会话中,你所有后续的 SSH 连接都将自动使用这个密钥,在也不会要求你输入密码短语了。
简化连接:配置 ~/.ssh/config
如果你管理多台服务器,每次都输入 ssh username@long-ip-address 也很低效。你可以在本地电脑的 ~/.ssh/ 目录下创建一个 config 文件来管理所有连接。
touch ~/.ssh/config
nano ~/.ssh/config
在文件里,你可以这样设置别名:
# 我的主力开发服务器
Host dev-server
HostName 123.45.67.89
User sammy
IdentityFile ~/.ssh/id_ed25519
# 公司的跳板机
Host bastion
HostName bastion.mycompany.com
User myuser
IdentityFile ~/.ssh/work_key
保存后,你只需要输入 ssh dev-server 就可以连接到你的开发服务器了,非常方便。
疑难解答
-
错误:
Permission denied (publickey)- 最常见的原因是服务器上
~/.ssh目录或authorized_keys文件的权限不对。SSH 对权限要求很严格。请在服务器上运行chmod 700 ~/.ssh和chmod 600 ~/.ssh/authorized_keys来修复。 - 也可能是你本地的私钥文件权限过于开放。运行
chmod 600 ~/.ssh/id_ed25519。
- 最常见的原因是服务器上
-
还是提示我输入密码
- 这说明服务器没有成功识别你的密钥。检查一下你的公钥内容是否完整、正确地复制到了服务器的
authorized_keys文件中,确保没有换行或缺失字符。
- 这说明服务器没有成功识别你的密钥。检查一下你的公钥内容是否完整、正确地复制到了服务器的
-
万能调试工具
- 如果遇到任何连接问题,使用
-v(verbose) 参数,它会打印出详细的连接过程,能帮你快速定位问题所在。
ssh -v sammy@123.45.67.89如果信息不够,可以用
-vv甚至-vvv获取更详细的输出。 - 如果遇到任何连接问题,使用
配置 SSH 密钥登录是一个一劳永逸的过程。花上几分钟,你就能大大提升服务器的安全性和自己的工作效率。
关于
关注我获取更多资讯