首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >PuTTY 加载密钥失败?先分清 PPK 和 OpenSSH 两种格式

PuTTY 加载密钥失败?先分清 PPK 和 OpenSSH 两种格式

原创
作者头像
PC电脑医生
修改于 2026-10-10 15:53:49
修改于 2026-10-10 15:53:49
1160
举报

密钥文件明明是对的,在 Linux 上 ssh 能用,拿到 PuTTY 里却加载不了。

或者反过来——PuTTY 生成的密钥,导入别的工具报错:

代码语言:bash
复制
PuTTY key format too new

这类问题跟密钥本身没关系,是"容器"不匹配。

密钥其实有两层

理解这个问题,得先分清两件事。

第一层:密钥的数学材料。

就是那对 RSA 或 Ed25519 的私钥/公钥数值。这部分是通用的——不管用什么工具,同一对密钥的数学内容完全一样。

第二层:密钥文件怎么存。

同样一份材料,可以用不同的方式打包进文件:

  • 用什么算法加密
  • 元数据放在哪
  • 校验信息怎么算

这就是"格式"的差别。

钥匙是同一把,但装钥匙的盒子有好几种。

工具只认自己那套盒子——盒子不对,就报"无法加载",跟钥匙对不对无关。

三个家族

实际会遇到的主要有三种。

PPK:PuTTY 专有

PPK 是 PuTTY Private Key 的缩写,是 PuTTY 自己定义的容器格式。

它的特点是文件里除了密钥材料,还带了一堆元数据——算法信息、注释、加密参数等。

因为是自己定的标准,只有 PuTTY 系的工具认识它:PuTTY、PuTTYgen、WinSCP、TortoiseGit 这些。

PEM:老牌通用格式

文件头长这样:

代码语言:bash
复制
-----BEGIN RSA PRIVATE KEY-----

这是 OpenSSL 定义的标准,通用性最强。云服务商的控制台、很多第三方工具都认这个。

但要注意:它是较老的格式,新版的 ssh-keygen 默认不再生成它。

OpenSSH:现代默认

文件头是:

代码语言:bash
复制
-----BEGIN OPENSSH PRIVATE KEY-----

这是 OpenSSH 自己的一套格式,现代 ssh-keygen 默认生成的就是它。

好处是支持更现代的加密方式,还带有注释字段。

但代价是——某些老工具不认识它。

看文件头就能判断

这是最实用的一个技巧。

不用打开软件试,直接看文件第一行:

  • -----BEGIN RSA PRIVATE KEY-----(格式:PEM;谁能用:通用性强)
  • -----BEGIN OPENSSH PRIVATE KEY-----(格式:OpenSSH;谁能用:OpenSSH / 新工具)
  • PuTTY-User-Key-File-*(格式:PPK;谁能用:PuTTY 系)

同样,公钥的写法也分两种:

  • OpenSSH 公钥:ssh-rsa AAAAB3Nza... user@host
  • PPK 公钥:一长串类似,但通常从 PuTTYgen 界面复制

遇到"格式不对"的报错,先看文件头,基本就知道问题在哪了。

三个具体场景

场景一:拿 id_rsa 直接给 PuTTY

现象:在 PuTTY 里选择私钥文件,提示加载失败。

原因:id_rsa 通常是 OpenSSH 或 PEM 格式,PuTTY 读不了。它只认 PPK。

处理:用 PuTTYgen 转一次。

打开 PuTTYgen → 点 Load → 选择你的 id_rsa (注意把文件类型筛选改成"All Files",否则看不到没有扩展名的文件)→ 加载成功后点 Save private key,存成 .ppk。

关键一点:转换不改变密钥本身。

私钥材料原封不动,只是换了个容器。所以服务器上的 authorized_keys 不用动,转换后照样能登录。

场景二:PuTTY key format too new

现象:PuTTY 生成的密钥,导入旧版 WinSCP、FileZilla 或某些工具时报错。

原因:这是 PPK 版本的问题。

  • v2:老版本,兼容性好
  • v3:PuTTYgen 0.75%2B 默认生成,用了新的加密算法

新版本生成 v3,老工具只认 v2——于是报"格式太新"。

处理:用 PuTTYgen 打开密钥,在菜单里找到保存参数设置,把 PPK 版本改成 2,再保存一份。

两个方向都有代价:

  • 降到 v2 → 兼容性好了,但用不上 v3 的新加密
  • 升级工具 → 保持 v3,但得确保所有相关软件都支持

如果只是偶尔兼容一下老软件,存两份就行。

场景三:指纹对不上

现象:连接时提示服务器指纹变化,或者你拿着指纹去核对,怎么都对不上。

原因:指纹有两种算法,显示出来完全不同。

  • MD5:aa:bb:cc:dd:...(十六进制,带冒号)
  • SHA256:SHA256:AbCd1234...(Base64 编码)

同一把密钥,两种算法算出来的字符串毫无相似之处。

如果文档给的是 MD5,你在客户端看到的是 SHA256,那永远对不上——不是密钥错了,是基准不一样。

现在的默认是 SHA256(OpenSSH 6.8 之后)。MD5 属于遗留标准,只在跟很老的系统比对时才需要。

核对指纹时先确认对方给的是哪种,能省掉很多困惑。

PuTTY 其实是一套工具

顺便说个常被忽略的点。

PuTTY 不只是那个窗口程序,它包含一组工具:

  • PuTTY:终端连接
  • PuTTYgen:生成和转换密钥
  • Pageant:密钥代理
  • plink:命令行连接
  • pscp:命令行传文件

Pageant 值得单独提一下。

它做的事是:把私钥加载进内存,然后给其他工具用。

好处是——私钥不用反复解密。你只在添加密钥时输一次密码,之后 PuTTY、plink、pscp 都能直接用,不用每次都输。

用法:启动 Pageant(会缩到系统托盘)→ 双击图标 → Add Key → 选择 .ppk → 输入密码。

之后这些命令就不用再认证了:

代码语言:bash
复制
plink user@hostname "ls -l"
代码语言:bash
复制
pscp local_file.txt user@hostname:/remote/path/

它俩会自动去找 Pageant,不需要额外加参数。

如果还是提示输密码,加 -v 看详细日志,观察有没有去查 Pageant。

要让 Pageant 开机自动加载密钥,可以在快捷方式的目标后面直接跟上密钥路径:

代码语言:bash
复制
"C:\Program Files\PuTTY\pageant.exe" "C:\keys\mykey.ppk"

一句总结

"密钥不能用"这个说法不准确——多数时候是格式不匹配。

钥匙是同一把,盒子不一样。

遇到这类问题,按这个顺序:

  1. 看文件头,确认是什么格式
  2. PPK 报错,检查是不是 v2/v3 版本问题
  3. 指纹对不上,先确认对方给的是 MD5 还是 SHA256

搞清楚这三点,PuTTY 的密钥问题基本都能定位。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

目录
  • 密钥其实有两层
  • 三个家族
    • PPK:PuTTY 专有
    • PEM:老牌通用格式
    • OpenSSH:现代默认
  • 看文件头就能判断
  • 三个具体场景
    • 场景一:拿 id_rsa 直接给 PuTTY
    • 场景二:PuTTY key format too new
    • 场景三:指纹对不上
  • PuTTY 其实是一套工具
  • 一句总结
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档