识别私有或公共 ssh 密钥

识别私有或公共 ssh 密钥

我的目录中有几个密钥~/.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 文件:

  1. OpenSSH .pub 文件将所有内容都放在一行很长的内容中;
  2. 第一个字段是键类型;
  3. 第二个字段是 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 ----
    (请注意,是四个破折号和一个空格,而不是五个破折号。)

相关内容