什么是 SSH 密钥登录?
想象一下,登录服务器就像开门。
密码登录:就像使用一个口令。你知道口令,告诉门口的守卫,守卫确认无误后让你进去。但口令容易被偷听(网络嗅探)或被暴力猜解(不断尝试常用密码)。
密钥登录:就像使用一把独一无二的物理钥匙去开一把与之匹配的锁。这把钥匙本身极其复杂,几乎不可能被伪造。
SSH 密钥登录就采用了这种“钥匙和锁”的模式,它由一对密钥组成:
私钥 (Private Key):这是你的“钥匙”。它必须被 绝对安全地 保存在你自己的电脑(客户端)上,绝不能泄露给任何人。文件名通常是
id_rsa或id_ed25519。公钥 (Public Key):这是你的“锁”。你可以把它自由地分发给你想登录的任何服务器。它会被放置在服务器上,相当于在服务器的门上安装了一把你的私钥才能打开的锁。文件名通常是
id_rsa.pub或id_ed25519.pub。
为什么 SSH 密钥登录更好?
极高的安全性:
防暴力破解:SSH 密钥通常由 2048 位或 4096 位的加密算法生成,其复杂性远超人类能记住的任何密码。使用现有计算能力,想通过暴力破解来猜出一把私钥是几乎不可能的。
防密码泄露:由于你不需要在网络上传输密码,即使网络连接被监听,攻击者也无法截获你的登录凭证。
极大的便利性:
一键登录:配置好之后,登录服务器、使用
scp传输文件或通过git推送代码都无需再手动输入密码,大大提高了工作效率。便于自动化:在编写需要访问远程服务器的自动化脚本(例如备份、部署脚本)时,使用密钥可以实现无缝、非交互式的安全登录。
工作原理(简述)
当你尝试使用密钥登录服务器时,会发生一个“挑战-应答”的认证过程:
客户端请求:你的电脑(客户端)向服务器发起连接请求,并告知服务器:“我想用这个 ID 的密钥来登录”。
服务器挑战:服务器在自己的“授权列表”(
~/.ssh/authorized_keys文件)中查找你的公钥。找到后,服务器会生成一个随机的字符串(挑战),并用你的公钥对这个字符串进行加密。发送挑战:服务器将这个加密后的字符串发送给你的客户端。
客户端解密:由于只有你的私钥才能解开对应公钥加密的内容,你的客户端使用本地存储的私钥成功解密,得到原始的随机字符串。
发送应答:客户端将解密后的原始字符串发回给服务器。
认证成功:服务器对比自己最初生成的字符串和客户端发回的字符串,如果完全一致,就证明你的确持有合法的私钥,于是允许你登录。
在这个过程中,你的私钥(最核心的秘密)从未离开过你的电脑。
如何设置 SSH 密钥登录(一步步指南)
我们以你的本地电脑为“客户端”,远程服务器为“服务器”来进行说明。
第 1 步:在客户端生成密钥对
在你自己的电脑上打开终端(Terminal / PowerShell)。
执行密钥生成命令。推荐使用更现代、更安全的
ed25519算法。Bash
ssh-keygen -t ed25519 -C "your_email@example.com"-t ed25519: 指定密钥类型为 ed25519。如果需要兼容旧系统,可以使用-t rsa -b 4096。-C "your_email@example.com": 添加一个注释,通常用你的邮箱来标识这个密钥是谁的,便于管理。
回答提示问题:
Enter file in which to save the key...: 按回车键接受默认路径即可(通常是~/.ssh/id_ed25519)。Enter passphrase (empty for no passphrase):: 这是一个关键选项。不输入(直接回车):登录时完全不需要输入任何东西,最方便,适合自动化脚本。
输入密码:为你的私钥文件本身再加一把“保险锁”。即使你的私钥文件被盗,没有这层密码,攻击者也无法使用它。每次使用密钥时需要输入此密码(可以通过
ssh-agent缓存,避免重复输入)。为了安全,强烈建议设置一个健壮的密码。
命令执行完毕后,在你的 ~/.ssh/ 目录下会生成两个文件:id_ed25519 (私钥) 和 id_ed25519.pub (公钥)。
第 2 步:将公钥复制到服务器
你需要将公钥文件 (id_ed25519.pub) 的内容添加到服务器上。
方法 A:使用 ssh-copy-id (推荐,最简单)
ssh-copy-id 命令会自动帮你完成所有操作,包括在服务器上创建目录、设置正确的文件权限。
在你的客户端上执行以下命令(将 user 和 server_ip 替换为你的实际信息):
Bash
ssh-copy-id user@server_ip
系统会提示你输入一次服务器的登录密码。输入成功后,公钥就会被自动追加到服务器上 ~/.ssh/authorized_keys 文件的末尾。
方法 B:手动复制 (当 ssh-copy-id 不可用时)
在客户端上,显示并复制公钥的内容。
Bash
cat ~/.ssh/id_ed25519.pub复制终端输出的整行内容(以
ssh-ed25519开头,以你的邮箱结尾)。使用密码登录到你的服务器。
Bash
ssh user@server_ip在服务器上,将你复制的公钥内容追加到
authorized_keys文件中。Bash
# 确保 .ssh 目录存在 mkdir -p ~/.ssh # 将公钥内容追加到文件中,请确保使用 >> 而不是 > echo "在这里粘贴你复制的公钥内容" >> ~/.ssh/authorized_keys # 设置正确的文件权限(至关重要!) chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys注意:如果权限不正确(例如过于开放),SSH 服务器会因为安全原因拒绝使用密钥登录。
第 3 步:测试登录
现在,你已经完成了所有设置。在你的客户端上,尝试再次登录服务器:
Bash
ssh user@server_ip
如果一切正常,系统将不再要求你输入密码(如果设置了密钥的 passphrase,会提示输入 passphrase),直接成功登录。
第 4 步:(可选但强烈推荐) 禁用密码登录
为了最大化安全性,当你确认密钥登录工作正常后,可以完全禁用服务器的密码登录功能,强制所有人都必须使用密钥。
在服务器上,编辑 SSH 配置文件:
Bash
sudo nano /etc/ssh/sshd_config找到并修改以下行(确保前面的
#已被移除):PasswordAuthentication no保存文件并退出 (
Ctrl+X,Y,Enter)。重启 SSH 服务以使配置生效:
Bash
sudo systemctl restart ssh