我的目录中有几个密钥~/.ssh
。我需要识别此目录中的文件是私钥还是公钥,而不依赖于.pub
扩展名(因为密钥可以重命名和使用)。
我试过了ssh-keygen -lf <priv key>
,但它打印的详细信息与公钥相同。
# diff <(ssh-keygen -lf id_rsa) <(ssh-keygen -lf id_rsa.pub)
#
当我尝试ssh-keygen -ef
上述命令时,结果相同。
有没有更好的方法来查找密钥是私钥还是公钥cat <key> | grep -i public
?
答案1
假设您只对与 OpenSSH 兼容的密钥感兴趣,如果它以----
(四个 ASCII 连字符)开头,那么您可以说它是一个私钥。
私钥头
“新” OpenSSH 格式的私钥以以下内容开头:
-----BEGIN OPENSSH PRIVATE KEY-----
PEM 和 PKCS#8 格式的私钥以以下之一开头:
-----BEGIN RSA PRIVATE KEY-----
-----BEGIN DSA PRIVATE KEY-----
-----BEGIN EC PRIVATE KEY-----
-----BEGIN PRIVATE KEY-----
-----BEGIN ENCRYPTED PRIVATE KEY-----
- (PKCS#8 密钥也可以是二进制 DER,但这并不常见。)
PuTTY“PPK”格式的私钥(主要用于 Windows)以以下内容开头:
PuTTY-User-Key-File-2:
SSH.COM 格式的私钥(在某些非 Linux 操作系统上使用)以以下内容开头:
---- BEGIN SSH2 ENCRYPTED PRIVATE KEY ----
(请注意,是四个破折号和一个空格,而不是五个破折号。)
公钥头
OpenSSH 单行格式的公钥不要有一个固定的标头。(它们以密钥格式开头,才不是总是以ssh-
或开头ecdsa-
。)但是在对第二个字段进行 Base64 解码后可以可靠地检测到它们,因为它包含第一个字段中的密钥类型的完全重复。
另一方面,如果您直接检查文件,则只需查看并识别其一般形状就可以轻松判断它是一个 OpenSSH .pub 文件:
- OpenSSH .pub 文件将所有内容都放在一行很长的内容中;
- 第一个字段是键类型;
- 第二个字段是 Base64 编码的公共数据,实际上总是以 开头
AAAA
。
下面列出的其他格式仅供一般参考 - 你不会在 ~/.ssh/ 下找到它们:
PEM 和 PKCS#8 格式的公钥(这种组合在 OpenSSH 中几乎从未使用过)以下列之一开头:
-----BEGIN RSA PUBLIC KEY-----
-----BEGIN DSA PUBLIC KEY-----
-----BEGIN EC PUBLIC KEY-----
-----BEGIN PUBLIC KEY-----
- 密钥也可以采用二进制 DER 格式,但这种情况不太常见。
SSH.COM(RFC 4716)格式的公钥以以下内容开头:
---- BEGIN SSH2 PUBLIC KEY ----
(请注意,是四个破折号和一个空格,而不是五个破折号。)