前言

密码登录省事,但公网 SSH 扫库、撞库很常见。更稳妥的做法是 公钥写在服务器、私钥只留本机,用密钥认证登录。

大致流程: Debian 系统 上生成兼容性好的 RSA PEM 密钥,用 FinalShell 把私钥落到本机并完成连接配置。

铁律(避免把自己锁在门外):

  1. 改认证相关配置时,始终保留一条已登录的会话,用新连接验证成功后再关旧会话。
  2. 先密钥测通,确认能进 shell,再考虑改端口、关密码等加固。

约定:

说明
管理用户 root(单人自用常见;普通用户同理,路径换成对应用户家目录)
初始端口 仍为 22(先把密钥跑通;改端口是后话)
密钥文件名 id_finalshell_rsa(可自定,全文保持一致即可)
本机私钥路径 C:\Users\你的用户名\.ssh\id_finalshell_rsa

原理

SSH 密钥登录是非对称加密:

  • 私钥:只放本机,用来向服务器证明「我是密钥持有者」。
  • 公钥:写入服务器 ~/.ssh/authorized_keys,一行一把。

握手时服务器用公钥校验本机私钥签名,通过即放行,不必再传登录密码(若你给私钥设了口令,客户端会再要一次「私钥密码」,那是另一层保护)。

为何选 RSA + PEM?OpenSSH 新格式、ed25519 都很好,但部分 FinalShell 版本对私钥格式/绑定 UI 不友好。 ssh-keygen -t rsa -b 4096 -m PEM 兼容性最好,私钥文件头多为:

1
-----BEGIN RSA PRIVATE KEY-----

1
-----BEGIN PRIVATE KEY-----

服务器上生成密钥并写入 authorized_keys

用 FinalShell(或任意 SSH 客户端)先用密码连上服务器,在 root shell 执行:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
mkdir -p /root/.ssh
chmod 700 /root/.ssh

# -N "":私钥不设口令(日常更省事)
# 若要私钥口令,去掉 -N "",按提示设置即可
ssh-keygen -t rsa -b 4096 -m PEM \
-f /root/.ssh/id_finalshell_rsa \
-C "vps-root" \
-N ""

# 公钥追加进授权列表(用 >>,不要用 > 覆盖)
cat /root/.ssh/id_finalshell_rsa.pub >> /root/.ssh/authorized_keys
chmod 600 /root/.ssh/authorized_keys /root/.ssh/id_finalshell_rsa
chmod 644 /root/.ssh/id_finalshell_rsa.pub

# 自检
wc -l /root/.ssh/authorized_keys
head -n 1 /root/.ssh/id_finalshell_rsa

权限含义简要:

路径 权限 原因
/root/.ssh 700 目录仅 root 可进
authorized_keys、私钥 600 仅本人读写;过松时 sshd 可能直接拒绝密钥

多把公钥: 以后给另一台电脑、CI、旧机 rsync 加钥时,一律 >> 追加。> 会清空原文件,已有的 FinalShell 密钥会被踢掉。


用FinalShell把私钥下载到本机

私钥此时还在服务器上,必须先拷到本机再删服务端副本

本机准备目录

Windows PowerShell:

1
New-Item -ItemType Directory -Force -Path $env:USERPROFILE\.ssh | Out-Null

FinalShell 文件管理下载(推荐)

  1. 保持当前服务器会话已连接。
  2. 打开该连接的 文件管理 / SFTP(与终端同主机)。
  3. 进入目录:/root/.ssh/
  4. 找到 id_finalshell_rsa不要只下 .pub;登录用的是私钥)。
  5. 下载到本机:C:\Users\你的用户名\.ssh\id_finalshell_rsa
    • 不要改扩展名、不要多存成 .txt
    • 若系统提示覆盖,确认路径无误再覆盖。

备选:本机 scp(仍可用密码时)

1
scp root@你的服务器IP:/root/.ssh/id_finalshell_rsa $env:USERPROFILE\.ssh\id_finalshell_rsa

下载后本机检查文件存在且非空:

1
2
Get-Item $env:USERPROFILE\.ssh\id_finalshell_rsa
Get-Content $env:USERPROFILE\.ssh\id_finalshell_rsa -TotalCount 1

第一行应是 -----BEGIN ... PRIVATE KEY-----


服务器上删除私钥副本

确认本机私钥已下好、能打开之后,回到服务器 shell:

1
2
rm -f /root/.ssh/id_finalshell_rsa
ls -la /root/.ssh/

期望:

  • 仍有 authorized_keys(以及可选的 .pub.pub 可留可删,不影响登录)。
  • 不应再有 可登录用的 id_finalshell_rsa 私钥。

公钥已在 authorized_keys 里,登录不依赖服务端再存一份私钥。私钥长期放在服务器上,一旦机器被入侵,攻击者等于拿到你的登录钥匙。


FinalShell 新建/编辑密钥连接

  1. 打开 连接管理器
  2. 新建 SSH 连接,或编辑已有主机(建议单独一条,名称加 -密钥 之类后缀,方便和密码条目区分)。
  3. 基本信息示例:
填写
名称 自定义,如 hostdzire-密钥
主机 服务器公网 IP 或域名
端口 当前 SSH 端口(默认 22;若已改过则填实际端口)
用户名 root
  1. 认证方式选公钥
    • 私钥路径:浏览选中
      C:\Users\你的用户名\.ssh\id_finalshell_rsa
  2. 若生成密钥时设过私钥口令,在对应栏填入;未设置则留空。
  3. 保存后 连接

FinalShell 选钥相关说明

部分 FinalShell 3.9.x 会出现反复弹「选择私钥」、绑定后仍像没带上 key 的情况。处理优先级:

  1. 确认私钥是 PEM/RSA(本文生成方式),路径正确、文件完整。
  2. 在该连接的编辑页 重新浏览绑定 私钥,保存后再连。
  3. 若仍异常:用 Windows 自带 OpenSSH 先验证服务器侧密钥是否正确(见下一步)。OpenSSH 能通、FinalShell 不通,多半是客户端 UI/绑定问题,不是 authorized_keys 写错。

测通

本机 PowerShell(端口仍为 22 时):

1
ssh -i $env:USERPROFILE\.ssh\id_finalshell_rsa -o IdentitiesOnly=yes root@你的服务器IP
  • 第一次连接会提示确认 host key,输入 yes
  • -o IdentitiesOnly=yes:只用你指定的私钥,避免本机 agent 里其他钥匙干扰排错。

能进入 root shell 即密钥链路完整。 此时可把 FinalShell 里旧的「仅密码」连接留着备用,或改成同一把私钥后日常只用密钥条目。

小结

整条链路可以记成:

1
2
3
4
5
服务器生成 RSA PEM
→ 公钥 >> authorized_keys
→ FinalShell 下载私钥到 %USERPROFILE%\.ssh\
→ 服务器删除私钥副本
→ FinalShell 连接绑定私钥并测通

私钥只在本机、公钥在服务器,是 SSH 密钥登录的正确形态。FinalShell 负责「连得舒服」;密钥本身是否正确,以 绑定同一把私钥的 OpenSSH 测通 为准,两边一起用排错最快。
)