SSH 密钥登录能免去反复输入长密码,并大幅降低暴力破解风险。教程面向新手,覆盖 Windows、Linux、macOS,讲解生成密钥对、把公钥安装到服务器、设置权限、测试连接,以及可选禁用密码登录加固。照做即可实现快速、安全登录。
用密码登录服务器有两个麻烦:每次都要输一长串密码;密码太简单容易被暴力破解。SSH 密钥登录能同时解决这两个问题——配好之后双击即连,而且几乎不可能被爆破。
这篇写给完全没接触过密钥的新手,Windows、Linux、macOS 都覆盖到,照着敲命令就行。 文章由 997wan.com(大番茄)整理,示例里的服务器地址就用站长日常在用的 192.168.11.253 这类内网地址,你换成自己的即可。
一、先搞明白:公钥和私钥是啥关系
一句话:私钥自己留着,公钥扔到服务器上。
打个比方:
- 私钥 = 你家的钥匙,只能自己拿着,谁拿到谁能开你所有的门
- 公钥 = 一把锁,你把它装到服务器上(可以复制很多份,装很多台服务器)
登录时,服务器用你装上去的”锁”出一个题,你本地用”钥匙”答对,就放行。整个过程密码不在网络上传输,所以即使被监听也偷不到。
生成后会得到两个文件:
| 文件 | 作用 | 能不能给别人 |
|---|---|---|
id_ed25519 |
私钥 | ❌ 打死也不能 |
id_ed25519.pub |
公钥 | ✅ 随便复制到服务器 |
记住:文件名带
.pub的才是能往外传的那个。
二、生成密钥对
Windows(Git Bash / PowerShell / CMD 都行)
打开终端,执行(把邮箱换成你自己的,只是个备注):
ssh-keygen -t ed25519 -C "admin@997wan.com"
接着会问三个问题,一路按回车即可:
Generating public/private ed25519 key pair.
Enter file in which to save the key (C:\Users\你/.ssh/id_ed25519): ← 回车
Enter passphrase (empty for no passphrase): ← 回车(或设个密码,更安全)
Enter same passphrase again: ← 回车
完成后密钥在 C:\Users\你的用户名\.ssh\ 目录下。
💡 如果提示
ssh-keygen 不是内部或外部命令:装一个 Git for Windows,用它自带的 Git Bash 执行即可。
Linux / macOS
打开终端,同样一条命令:
ssh-keygen -t ed25519 -C "admin@997wan.com"
一路回车,生成在 ~/.ssh/ 下。
为什么用 ed25519,不是 RSA?
ed25519 是新一代算法,密钥短、速度快、安全性还更高。优先用它。
但有一个例外——如果你的服务器是 OpenWrt / iStoreOS 这类路由器系统,它们用的 SSH 服务端是 Dropbear,老版本只支持 RSA 密钥,用 ed25519 会登录失败。这种情况改用:
ssh-keygen -t rsa -b 4096 -C "admin@997wan.com"
判断方法:连上服务器看一眼 SSH 软件版本
ssh -V # 客户端
# 服务端:登录后执行
/usr/sbin/sshd -h 2>&1 | head -3 # OpenSSH 会显示版本
ls /usr/sbin/dropbear # 存在这个文件就是 Dropbear
已有的密钥怎么看
cat ~/.ssh/id_ed25519.pub
输出一整行,形如:
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIExampleKeyDataHere your_email@example.com
这一整行就是公钥内容,后面要完整复制到服务器。 注意是一行,中间不能断行。
三、把公钥装到服务器上
下面三种方法选一个能用的就行。
方法 1:ssh-copy-id(最省事,Linux/macOS/Git Bash)
ssh-copy-id root@192.168.11.253
按提示输入一次服务器密码,它就自动把公钥追加到服务器的 ~/.ssh/authorized_keys,权限也帮你设好。
如果你的密钥不是默认名字,用 -i 指定:
ssh-copy-id -i ~/.ssh/my_key.pub root@192.168.11.253
Windows 原生 PowerShell / CMD 没有
ssh-copy-id命令,用方法 2。
方法 2:一行命令手动装(通用,推荐 Windows 用)
Git Bash 里执行(把服务器 IP 换成你的):
cat ~/.ssh/id_ed25519.pub | ssh root@192.168.11.253 "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
输入一次密码就完事。这条命令做的事:连上服务器 → 建 .ssh 目录 → 把公钥追加进去 → 设好权限。
方法 3:手动复制粘贴(最原始,但一定管用)
第 1 步:本地把公钥内容打印出来,完整选中复制(从 ssh-ed25519 一直到最后的邮箱):
cat ~/.ssh/id_ed25519.pub
第 2 步:用密码登录服务器,编辑文件:
mkdir -p ~/.ssh
chmod 700 ~/.ssh
vi ~/.ssh/authorized_keys
按 i 进入编辑,把刚才复制的一整行粘贴进去(如果文件里已有内容,另起一行粘),按 Esc 后输入 :wq 保存退出。
第 3 步:一定要设权限(下一步讲为什么):
chmod 600 ~/.ssh/authorized_keys
云服务器(阿里云/腾讯云)也可以在控制台的「密钥对」页面直接粘贴公钥,创建实例时绑定,原理一模一样。
四、设置权限(不做这步,密钥登录会失败)
这是新手最常踩的坑。SSH 对密钥文件权限极其敏感,只要权限太宽松,它会直接拒绝使用,而且报错信息还很含糊。
在服务器上执行:
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
chown -R $USER:$USER ~/.ssh
在本地也一样,私钥权限要收紧:
chmod 600 ~/.ssh/id_ed25519 # Linux / macOS / Git Bash
Windows 上如果报 Permissions for 'id_ed25519' are too open:右键私钥文件 → 属性 → 安全 → 高级 → 禁用继承 → 把其他用户全部删掉,只保留你自己。
五、测试登录
ssh root@192.168.11.253
如果直接进去了、没让你输密码——恭喜,成功了。
如果本地有多个密钥,需要指定用哪个:
ssh -i ~/.ssh/my_key root@192.168.11.253
给服务器起个好记的别名(可选,强烈推荐)
编辑本地 ~/.ssh/config(没有就新建):
Host openwrt
HostName 192.168.11.253
User root
Port 22
IdentityFile ~/.ssh/id_ed25519
以后只要敲:
ssh openwrt
就能连,不用记 IP 和用户名。
六、加固:禁用密码登录(可选)
⚠️ 先确认密钥能正常登录,再关密码登录。 否则一旦密钥有问题,你就把自己锁在门外了。
确认密钥登录后,在服务器上编辑 SSH 配置:
vi /etc/ssh/sshd_config
找到并改成这样(没有就新增):
PubkeyAuthentication yes
PasswordAuthentication no
PermitRootLogin prohibit-password # 允许 root 用密钥登录,但禁止密码登录
保存后重启 SSH 服务:
# Debian / Ubuntu
systemctl restart ssh
# CentOS / RHEL
systemctl restart sshd
# OpenWrt
/etc/init.d/dropbear restart
注意:重启前务必另开一个终端窗口测试密钥能否登录,别把自己关在外面。OpenWrt 这类嵌入式设备重启 SSH 服务不会断掉已有连接,相对安全些。
七、出问题了怎么排查
1. 还是让我输密码
按顺序检查:
# 服务器上,确认公钥确实写进去了,而且是完整一行
cat ~/.ssh/authorized_keys
# 确认权限
ls -la ~/.ssh
.ssh 应该是 drwx------(700),authorized_keys 应该是 -rw-------(600)。
最常见的失败原因:粘贴公钥时被自动换行拆成了两行,或者复制时漏掉了开头的 ssh-ed25519。authorized_keys 里每一行必须是一条完整的公钥。
2. 报错 Permissions 0644 for 'xxx' are too open
权限问题,按第四节收紧权限:
chmod 600 ~/.ssh/id_ed25519
3. 报错 Load key "xxx": error in libcrypto: unsupported
这个坑特别隐蔽——私钥文件的换行符被改成了 CRLF(Windows 换行)。OpenSSH 解析不了。
常见于:用某些编辑器(比如记事本)打开/保存过私钥文件,或者从 Windows 传文件到 Linux 时格式被转换。
验证方法:
# 能正常输出一长串公钥,说明文件没问题
ssh-keygen -y -f ~/.ssh/id_ed25519
# 如果报 error in libcrypto,确认是换行符问题
file ~/.ssh/id_ed25519 # 显示 CRLF 就是中招了
修法:重新生成一对密钥最省事。如果必须修这个文件,可以用 Git Bash 转换行符:
# 备份后转成 LF
cp ~/.ssh/id_ed25519 ~/.ssh/id_ed25519.bak
sed -i 's/\r$//' ~/.ssh/id_ed25519
chmod 600 ~/.ssh/id_ed25519
教训:永远不要用记事本之类的编辑器打开或编辑私钥文件,复制内容用
cat输出到终端再看。
4. Windows 上 ssh-copy-id 命令不存在
正常的,Windows 原生没这个命令。改用第二节的方法 2(一行 cat | ssh),或者用 MobaXterm 这类终端工具,它自带图形化的密钥管理。
5. 想换密钥 / 撤销某台设备的访问
在服务器的 ~/.ssh/authorized_keys 里删掉对应那一行即可,即时生效。
总结:完整流程回顾
# ① 本地生成(一路回车)
ssh-keygen -t ed25519 -C "admin@997wan.com"
# ② 公钥装到服务器(输一次密码)
ssh-copy-id root@服务器IP
# Windows 用这条:
cat ~/.ssh/id_ed25519.pub | ssh root@服务器IP "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
# ③ 测试
ssh root@服务器IP
# ④ 确认能登进去后,再考虑关掉密码登录
整个过程一次配置,终身受用。后面每加一台新服务器,只要重复第 ② 步就行——同一把私钥可以配无数台服务器。
只有一点要牢记:私钥不外传。 换电脑时可以把私钥复制过去(用 U 盘,别用网盘/微信),丢了就重新生成一对,把新公钥再装一遍服务器。
写在最后
这篇由 997wan.com(大番茄) 整理。大番茄这个站主要记录服务器、网络、OpenWrt 这些折腾过程中的实操笔记,如果有哪一步卡住了,欢迎在下方留言,我看到会回复。
相关阅读:Linux 常用命令大全、OpenWrt 配置 SSL 证书开启 HTTPS、国内外常用 DoH/DoT 服务汇总,都是从实际踩坑里整理出来的同类笔记。
- 文章名称:SSH 密钥登录新手教程:从生成密钥到启用(一次配好,终身免密)
- 文章永久网址:https://www.997wan.com/ssh-key-login-tutorial/
- 本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长 997笔记 进行删除处理。
- 本站一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
- 本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
- 本站资源大多存储在云盘,如发现链接失效,请联系我们我们会第一时间更新。
- 如无特别声明本文即为原创文章仅代表个人观点,版权归《997笔记》所有,欢迎转载,转载请保留原文链接。