我在 StackOverflow 上看到了很多与生成 SSH 密钥指纹相关的问题的答案。在这些答案中,几乎总是建议使用ssh-keygen
如下方法生成指纹:
ssh-keygen -lf <path_to_public_key>
然而,GitHub 的文档建议使用以下命令创建 SSH 密钥指纹:
openssl rsa -in PATH_TO_PEM_FILE -pubout -outform DER | openssl sha256 -binary | openssl base64
当我对同一个公钥执行这两个命令时,我得到了不同的指纹。所以我的问题是哪个指纹是正确的?
答案1
但是,GitHub 的文档建议应该使用以下命令创建 SSH 密钥指纹:
事实并非如此。文档根本没有谈论 SSH 密钥——本文是关于用于签署 JWT 消息(API 请求)的 PKCS#1 格式密钥。GitHub 选择以 OpenSSH 流行的“SHA256:<base64>”样式表示指纹,但这并不意味着它是 SSH 密钥。
在这两种情况下(SSH 和 PKCS#1/PEM),指纹都是公钥的简单 SHA256 哈希。但是,密钥以两种不同的格式存储(序列化)——PKCS#1 密钥使用 ASN.1 DER 序列化,而 SSHv2 有自己的序列化格式。
当输入相同的密钥时,实际的 RSA 值(模数和指数)在两种情况下当然会保持不变,但它们的格式不同,顺序可能不同,并且附加字段可能以一种格式存在,但不以另一种格式存在。
(想象一下有一个 JSON 文档和一个 YAML 文档。它们可能代表相同的数据,并且可以直接从一个转换为另一个,但仍然具有不同的哈希值。)