如果有的话,SSH 密钥与用于其他目的的非对称密钥有何不同?

如果有的话,SSH 密钥与用于其他目的的非对称密钥有何不同?

如果有的话,SSH 密钥与用于其他目的(例如电子邮件签名)的非对称密钥有何不同?

我之所以问这个问题,部分原因是在 OS X 上,有管理 SSH 密钥的应用程序(ssh-agent、SSHKeychain 等)以及用于管理 GPG 密钥的应用程序(GPG Keychain Access 等),但显然两者从未相遇。不过,我不认为这是 OS X 特有的问题。

这种关注点分离是因为密钥的种类完全不同,还是因为它们存储在不同的地方,或者是因为其他原因或多种原因(例如历史原因)?

答案1

  • SSH 密钥只是普通的 RSA、DSA 或 ECDSA 非对称密钥对。OpenSSH 生成的此类密钥对已可供 OpenSSL 和大多数其他程序使用。

    .pub文件输出ssh-keygen采用 OpenSSH 特定格式,但这并不重要,因为“私有”文件已经包含私钥和公钥。)

    其他 SSH 软件可能有自己的存储格式,例如RFC 4716或 PuTTY丙酸激酶,但它们存储的是相同的RSA/DSA/ECDSA信息。

  • X.509(由 SSL、S/MIME 使用)稍微复杂一些:“私钥”仍然相同,但您拥有的不是裸露的公钥文件,而是“证书”——包含公钥、主题和颁发者名称、有效期的 ASN.1 结构。在 X.509 v3 证书中,将存在“密钥用法”和“备用主题名称”等扩展。整个证书由发行人的密钥(如果没有单独的发行者,则为自签名密钥)。

    您可以轻松地将 X.509“私钥”文件用于 SSH – OpenSSH 甚至使用相同的格式。

    您可以从一个简单的密钥对创建一个 X.509 证书,然后对其进行自签名,或者您可以创建一个“证书请求”并提交给 CA(证书颁发机构)进行签名。

    要显示 X.509 证书中的信息,请使用:

     certtool -i < foo.pem
     certtool -i --inder < foo.crt
    
     openssl x509 -noout -text < foo.pem
     openssl x509 -noout -text -inform der < foo.crt
    

    certtool是 GnuTLS 的一部分。)

  • OpenPGP(由 GPG 使用)密钥是最复杂的。您所说的“PGP 密钥”或“PGP 密钥对”是一种称为“OpenPGP 证书”的复杂结构,其中包含:

    • 一个“主密钥”——非对称密钥对,通常用于签名
    • 一个或多个“用户 ID” - 文本标签,通常采用“姓名 <email@address>”格式
      • 其中至少一个被标记为“主要用户 ID”
      • 对于每个用户 ID,都有一个“自签名”——用你自己的主密钥签名
      • 对于每个用户 ID,有零个或多个其他用户的“签名”
      • 自签名包还包含您首选的算法(SHA-1、AES 等)
    • 一个或多个“子密钥” – 附加密钥对,第一个通常用于加密
      • 对于每个子密钥,主密钥的签名
    • 零个或多个“照片 ID” – 包含您脸部的 JPEG 或 PNG 附件
      • 与用户 ID 的签名方式相同
    • 零个或多个 X.509 证书

    所有密钥对都有到期日期和使用位:签名数据、认证(签名)密钥、加密、向服务进行身份验证。主密钥默认具有“签名”和“认证”位,第一个子密钥用于“加密”。如果添加“身份验证”子密钥,则可以使用它进行gpg-agentSSH 身份验证。

    要查看您的证书包含的内容:

     gpg --export [email protected] | gpg -vv
    
     gpg --export [email protected] | certtool --pgp-certificate-info
    

    certtool是 GnuTLS 的一部分。)


X.509 证书及其相关私钥有几种格式:

  • 分布式能源是证书的 ASN.1 结构的二进制编码。此类文件通常具有.crt.cer文件扩展名(.der不太常见,但并非不常见)。

  • “PEM”格式的文件包含相同的 DER 编码数据,但使用 Base64 进行额外编码,并且位于“BEGIN THIS”和“END THAT”标头之间。常见的文件扩展名是.pem,尽管有时这里也会使用.crt.cer(但从不.der)。

  • 对于属于证书的私钥,通常使用“PEM”格式 - Base64 被标头“BEGIN PRIVATE KEY”(PKCS#7 结构中的密钥)或“BEGIN RSA(或 DSA)私钥”(裸密钥,OpenSSL 格式)。有时密钥位于单独的.key文件中,有时与证书捆绑在一起。

  • PKCS#12和稍微老一点的普福是存储证书和私钥(通常也存储颁发者的证书)的加密容器。大多数软件在导出或“备份”带有私钥的证书时都使用这种格式。

OpenPGP 中的情况不太令人困惑:所有数据都遵循相同的二进制格式,并且可以选择“装甲”(使用 Radix64 编码并位于类似 PEM 的标头之间)。

答案2

ssh存储在不同的地方,采用不同的格式(PGP、GnuPG 、 和几种不同的 X.509 格式等所使用的格式有很大不同)。通过混合和匹配ssh-keygenpgpgpg/ gpg2openssl等的正确选项,可以在一定程度上在它们之间进行代码转换;但一般来说,不值得这样做。另外,不同的密钥格式支持的信息量也不同,ssh携带的额外信息最少,而 X.509 PEM 和 DER 格式携带的信息最多。此外,OSX Keychain 只是加密的密钥/值存储,因此每个应用程序通常需要一种不同的机制来在程序的本机密钥 + 元数据格式和可以存储在 Keychain 中的内容之间进行转换。(KDE 钱包和 GNOME 钥匙串也存在类似的问题。)

相关内容