在客户端传过去
关于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 服务配置文件,比如是否允许密码登录、公钥登录等 |
总结认证过程
客户端发起连接,告诉服务器:“我是用户
orangepi,我想用公钥 A 登录。”服务器检查
~/.ssh/authorized_keys,发现存在公钥 A(表明是服务器认证的)。服务器生成一段随机数据(challenge),发送给客户端。(不需要加密)
客户端收到后,用私钥 A 对这段数据签名,发回给服务器。
服务器用
authorized_keys里的公钥 A 验证签名。验证成功 → 允许登录。
整个过程,私钥永远不离开客户端,公钥可以随便传。
[! note] 总结 私钥签名,公钥验签
常见疑惑
Q:公钥在别人那里,别人能连接我的服务器吗?
A:不能。别人只有你的公钥,没有你的私钥,无法生成有效签名。服务器要的是私钥签名。
Q:我把公钥放到别人的服务器上,我能连接别人的服务器吗?
A:能。这正是 SSH 免密登录的原理。你把公钥加到别人服务器的 authorized_keys 里,就等于授权自己的私钥可以登录那台服务器。你用自己的私钥就能连上。
Q:客户端还需要留公钥吗?
A:登录时不需要,但建议保留,方便复制到新服务器或重新生成。
留言区
不收集任何个人信息;昵称只绑定浏览器里的随机 Cookie。