contribute上次修改:2026-10-07

在客户端传过去

关于SSH,见二、本地登录与 SSH 远程登录 采用密码连接的方式,安全性较低,攻击者可能伪造成服务器诱导用户连接,密码也可能被暴力破解

SSH的密钥采用非对称加密技术,生成一对

公钥:存在待连接的服务器上,可以公开
私钥:存在客户端上,不能给任何人

创建SSH密钥对

这是生成密钥对的命令

ssh-keygen [选项 <参数>]
  • -t:指定密钥类型(如 rsa,ed25519 等),推荐 ed25519(更短、更安全),默认 rsa。
  • -m:指定密钥转换格式(如 PEM,PKCS8,RFC4716)。
  • -C:添加密钥注释(通常为邮箱或用途说明,方便识别)。
  • -f:指定密钥保存路径(默认 ~/.ssh/id_<type>,不建议一直使用默认路径)。
  • -b:指定密钥长度,默认 3072(RSA 算法)。
  • -N:不设置密码短语(连服务器,看私钥时输入),不设置就是-N ''

[! warning] 建议指定密钥保存路径 否则同一种类型一直放在~/.ssh/id_<type>里,后面又生成这种类型的,可能会覆盖(如果你同意了或者加了-y参数) 推荐在type后面加一点说明,比如ssh-keygen -t ed25519 -f /root/.ssh/id_ed25519_myserver

见:

PS C:\Users\Kristin> ssh-keygen -t ed25519
Generating public/private ed25519 key pair.
Enter file in which to save the key (C:\Users\Kristin/.ssh/id_ed25519):
Enter passphrase (empty for no passphrase): # 密码短语
Enter same passphrase again:
Your identification has been saved in C:\Users\Kristin/.ssh/id_ed25519
Your public key has been saved in C:\Users\Kristin/.ssh/id_ed25519.pub
The key fingerprint is: # 指纹,由公钥经过哈希计算后得出的一个简短字符串
SHA256:C3zsCHll6t3b3HNKsqpIVjibrPGrLrPUfndfzutI2Qo kristin@LAPTOP-6NSV79AP
The key's randomart image is: # 指纹的艺术图,便于一眼看出两把公钥是否一样
+--[ED25519 256]--+
|                 |
|                 |
|        o        |
|     o *         |
|    o B S        |
|   . = @ o   o   |
|  . o O + E + +  |
| .o. *... .* @. .|
|  .==o+o.oooB.B= |
+----[SHA256]-----+
PS C:\Users\Kristin> ssh-keygen -t ed25519
Generating public/private ed25519 key pair.
Enter file in which to save the key (C:\Users\Kristin/.ssh/id_ed25519):
C:\Users\Kristin/.ssh/id_ed25519 already exists.
Overwrite (y/n)? # 提示你是否要重写

1.客户端生成密钥对

ssh-keygen -t ed25519 -C "备注"

生成:

  • ~/.ssh/id_ed25519:私钥,留在客户端
  • ~/.ssh/id_ed25519.pub:公钥,传到服务端

2.公钥传到服务端

# 在客户端传过去
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@服务器IP

或者手动把公钥添加到服务端~/.ssh/authorized_keys中

两边存放的东西

客户端(发起连接的设备)

文件 作用
~/.ssh/id_ed25519 私钥,必须保密,权限建议 600
~/.ssh/id_ed25519.pub 公钥,可以公开,通常也留在本地
~/.ssh/known_hosts 记录你连接过的服务器的主机公钥,防止中间人攻击
~/.ssh/config 可选,保存服务器别名、端口、用户名等
~/.ssh/authorized_keys 如果这台机器也作为服务器,存放允许登录它的其他客户端的公钥

客户端登录时,只需要私钥。 公钥不是登录必需品,但通常会保留,方便复制到其他服务器。

服务端(被登录的设备,比如香橙派)

通常会有:

文件/目录 作用
~/.ssh/authorized_keys 存放客户端的公钥,每行一个,表示允许这些公钥对应的私钥登录
/etc/ssh/ssh_host_* 服务器自己的主机密钥对,用于向客户端证明“我是真正的服务器”
/etc/ssh/sshd_config SSH 服务配置文件,比如是否允许密码登录、公钥登录等

总结认证过程

  1. 客户端发起连接,告诉服务器:“我是用户 orangepi,我想用公钥 A 登录。”

  2. 服务器检查 ~/.ssh/authorized_keys,发现存在公钥 A(表明是服务器认证的)。

  3. 服务器生成一段随机数据(challenge),发送给客户端。(不需要加密)

  4. 客户端收到后,用私钥 A 对这段数据签名,发回给服务器。

  5. 服务器用 authorized_keys 里的公钥 A 验证签名。

  6. 验证成功 → 允许登录。

整个过程,私钥永远不离开客户端,公钥可以随便传。

[! note] 总结 私钥签名,公钥验签

常见疑惑

Q:公钥在别人那里,别人能连接我的服务器吗?
A:不能。别人只有你的公钥,没有你的私钥,无法生成有效签名。服务器要的是私钥签名。

Q:我把公钥放到别人的服务器上,我能连接别人的服务器吗?
A:能。这正是 SSH 免密登录的原理。你把公钥加到别人服务器的 authorized_keys 里,就等于授权自己的私钥可以登录那台服务器。你用自己的私钥就能连上。

Q:客户端还需要留公钥吗?
A:登录时不需要,但建议保留,方便复制到新服务器或重新生成。

留言区

不收集任何个人信息;昵称只绑定浏览器里的随机 Cookie。