我发现ssh-keygen
("ssh" 包) 生成与puttygen
("油灰“ 包裹)。
如果我使用某些 SSH 服务器创建公钥和私钥,ssh-keygen
则不会接受我的密钥。如果我puttygen
只用一台服务器创建密钥则接受它。
为什么 Linux 存储库不为此提出一些通用的解决方案(包)?
我找到了另一个包裹ssh-3.2.9.1它创建与 PuTTY 一起使用的密钥。但为什么 SSH 没有任何方便的解决方案呢?
答案1
OpenSSH 是 SSH 协议事实上的标准实现。如果 PuTTY 和 OpenSSH 不同,则 PuTTY 是不兼容的。
如果您使用默认选项通过 OpenSSH 生成密钥ssh-keygen
,它几乎适用于所有服务器。不接受此类密钥的服务器将是古董,使用不同的 SSH 实现,或者以奇怪的限制方式进行配置。某些服务器可能不支持非默认类型的密钥。特别是,ECDSA 密钥使会话建立速度稍快,但仅最新版本的 OpenSSH 支持它们。
PuTTY 使用不同的密钥文件格式。它附带了工具转变它自己的.ppk
格式和 OpenSSH 的格式之间的关系。
您找到的这个 ssh-3.2.9.1 是商业产品它有自己不同的私钥格式。没有任何理由使用它来代替 OpenSSH。它只能是兼容性较差,需要付费,而且关于如何使用它的教程大约为零。
答案2
大多数 Linux 发行版都提供适用于 Linux 的 PuTTY(软件包名称putty
)。您可以在 Linux 端安装 PuTTY 并用于puttygen
将 .ppk 文件转换为常规ssh
样式密钥文件(称为 PEM 文件 - 即使它们的文件名中没有 .pem)。
puttygen id_dsa.ppk -O private-openssh -o id_dsa
笔记:您还可以使用puttygen
将样式 PEM 文件导入ssh
回 PuTTY。
PuTTY 的作者选择了简单性,因此公钥和私钥构成了 PuTTY/ 使用的底层安全性SSH-2密钥身份验证存储在单个专有 .ppk 文件中。通常,这些密钥由 维护为两个单独的文件ssh
。
在 Linux 上,密钥文件通常保存在目录中.ssh。
在这个 Stack Overflow 问题中,有一个关于转换过程的很好的概述,标题为:将 PEM 转换为 PPK 文件格式。
PuTTY 的作者还讨论了他在PuTTY 用户手册。您可以在第 8.2.12 节中阅读相关内容。
答案3
它们都存储“SSH 协议版本 2 的 RSA 密钥对”,并且可以转换的可互换;但是,关于实际存储格式的差异:
从https://www.chiark.greenend.org.uk/~sgtatham/putty/wishlist/key-formats-natively.html
PuTTY 密钥格式的优点是:
- 密钥的公共部分以明文形式存储。OpenSSH的私钥格式加密整个密钥文件,这样客户端就必须先询问您的密码,然后才能使用密钥执行任何操作。特别是,这意味着它必须先询问您的密码,然后才能提供向服务器发送公钥以进行身份验证。 PuTTY 的格式以明文形式存储公钥,仅加密私钥部分,这意味着它可以自动将公钥发送到服务器并确定服务器是否愿意接受使用该密钥的身份验证,并且它只会询问如果确实需要,请输入密码。
我认为 OpenSSH 会.pub
出于此目的读取一个文件,如果它与私钥文件一起出现,但这常常是一个混乱的根源(我见过人们替换私钥文件并留下一个过时的文件.pub
)它,然后对由此产生的 SSH 身份验证过程感到非常困惑!)。- 密钥完全防篡改。以明文形式存储公钥的密钥格式可能容易受到篡改攻击,在这种攻击中,密钥的公共部分会被修改,从而使用篡改的密钥进行的签名会泄露有关私有部分的信息。为此原因,PuTTY 的密钥格式包含 MAC(消息身份验证代码)、密码短语,并覆盖密钥的公共和私有部分。因此,我们提供了以明文形式提供公钥的便利,但我们也立即检测到任何篡改攻击的尝试,从而提供了安全性和便利性的结合,我认为在任何其他密钥格式中都找不到这种结合。作为一个附带好处,MAC 还涵盖了密钥的注释,防止有人交换两个密钥并交换注释时可能发生的任何恶作剧。
OpenSSH 保持公钥加密的方法可能也提供了一些针对此类攻击的安全性,但尚不清楚它是否提供了适当的保护:为保密而设计的加密通常会留下攻击者可以有效修改加密数据的方法。为了实现真正的完整性保护,您需要一个真正的专用 MAC,它的设计正是为了实现这一点。
[强调添加]