我想创建用于 SSH 身份验证的私钥和公钥对。
我无法弄清楚这之间的区别:
openssl genrsa -out MyPrivateKey 4096
openssl rsa -in MyPrivateKey -pubout -out MyPublicKey
它首先创建一个私有 RSA 密钥,然后从中派生公共密钥,或者:
ssh-keygen -b 4096 -t rsa -f MyFancyKey
这会在文件“MyFancyKey”中创建一个私有 RSA 密钥,并在“MyFancyKey.pub”中创建相应的公钥。
私钥的结构似乎有些相似,尽管创建的一个openssl
开头是:
-----BEGIN RSA PRIVATE KEY-----
并且从以下ssh-keygen
开始:
-----BEGIN OPENSSH PRIVATE KEY-----
这两种键之间有根本区别吗?
然后是相应的公钥,其中一个openssl
包含:
-----BEGIN PUBLIC KEY-----
...base64 encoded...
-----BEGIN PUBLIC KEY-----
而 fromssh-keygen
仅包含一行:
ssh-rsa XXXXXX...base64 encoded...XXXXX [email protected]
这些本质上是相同类型的数据,但格式不同吗?还是它们真的不相容?
我试图完全理解所有这些与 SSH 相关的工作原理。例如,为什么我的用户名、我的计算机名称和我的本地网络名称在该密钥中,它通常不应该用于访问其他计算机上的 SSH 吗?在那台计算机上使用我的用户名,而不是我自己的用户名。
私钥
不,它们本质上是相同的数据。
BEGIN RSA PRIVATE KEY
表示“PKCS#1”或“PEM”密钥格式,它是 ASN.1 DER 序列化结构的 Base64 编码。这是一个包含 RSA 参数(n、e、d、p、q等)的基本 ASN.1 序列。OpenSSH 实际上传统上也使用这种格式——因为它已经使用了 OpenSSL 的加密代码,所以“加载密钥”和“写入密钥”功能也很方便。
这意味着您可以使用
ssh-keygen -m PEM
来生成或转换此类密钥。BEGIN PRIVATE KEY
表示“PKCS#8”密钥格式(未加密);内容与上述格式非常相似,相同的 RSA 参数嵌套在另一个结构中,表明它确实是一个 RSA 密钥。与 PEM 相比,PKCS#8 格式更清晰地将“有效负载”(密钥算法、加密)与外部 Base64 包装器分开。但它不会改变数据的含义。
OpenSSH 也将识别这种格式(由于其 OpenSSL 用于密钥加载)。
BEGIN OPENSSH PRIVATE KEY
是 OpenSSH 为 OpenSSH 发明的一种格式。这次它使用 SSHv2 数据包序列化而不是 DER。OpenSSH 现在使用这种格式,以便它可以避免完全依赖 OpenSSL,和/或这样它可以添加新的密钥算法而无需等待 PKIX 标准化 ASN.1 序列化格式(否则与 SSH 完全无关)和然后等待 OpenSSL 实现它。
PuTTY 有自己的 .ppk 格式。您可以使用 /usr/bin/puttygen 在它们之间进行转换。
另请参阅:OpenSSH 公钥文件格式?
公钥
是的,它们本质上是相同的数据。
BEGIN PUBLIC KEY
我相信也是 PKCS#8 - 所以在 Base64 中有一个 DER 序列化的 ASN.1 结构,将其标识为 RSA 密钥,后跟密钥参数(n,e)单行格式部分是特定于 OpenSSH 的,尽管中央 Base64 编码数据的格式与 SSHv2 协议本身(“在线”)中使用的格式完全相同。正如您可能猜到的那样,编码数据使用 SSHv2 数据包序列化——但它仍然拥有相同的 RSA n和e值。
另请参阅:OpenSSH 公钥文件格式?
authorized_keys
当您有一个长文件时,这是一条注释,可帮助您将此公钥与其他公钥区分开来。