SSH 密钥登录新手教程:从生成密钥到启用(一次配好,终身免密)

AI 摘要大番茄AI

SSH 密钥登录能免去反复输入长密码,并大幅降低暴力破解风险。教程面向新手,覆盖 Windows、Linux、macOS,讲解生成密钥对、把公钥安装到服务器、设置权限、测试连接,以及可选禁用密码登录加固。照做即可实现快速、安全登录。

此内容由AI根据文章内容自动生成。

用密码登录服务器有两个麻烦:每次都要输一长串密码;密码太简单容易被暴力破解。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 服务汇总,都是从实际踩坑里整理出来的同类笔记。

上一篇 国内外常用 DoH/DoT 服务汇总(含 IPv4/IPv6 与接入地址)
下一篇 PVE 安装 img 格式虚拟机教程:qm importdisk 图文全流程