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

15 security ssh ssh-agent public-key-encryption

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

我被提示问这个,部分是因为在 OS X 上,有可用于管理 SSH 密钥的应用程序(ssh-agent、SSHKeychain 等)以及旨在管理 GPG 密钥的应用程序(GPG Keychain Access 等),显然,两人从未见面。但是,我不认为这是 OS X 特定的问题。

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

use*_*686 16

  • SSH 密钥只是普通的 RSA、DSA 或 ECDSA 非对称密钥对。OpenSSH 生成的这样一个密钥对已经可以被 OpenSSL 和大多数其他程序使用。

    .pubssh-keygenOpenSSH输出的文件是特定于 OpenSSH 的格式,但这无关紧要,因为“私有”文件已经包含私钥和公钥。)

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

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

    您可以轻松地为 SSH 使用 X.509“私钥”文件——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
    
    Run Code Online (Sandbox Code Playgroud)

    certtool是 GnuTLS 的一部分。)

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

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

    所有密钥对都有到期日期和使用位:签署数据、验证(签署)密钥、加密、验证服务。默认情况下,主密钥具有“签名”和“认证”位,第一个子密钥是“加密”。如果添加“身份验证”子项,则可以将其gpg-agent用于 SSH 身份验证。

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

    gpg --export joe@example.com | gpg -vv
    
    gpg --export joe@example.com | certtool --pgp-certificate-info
    
    Run Code Online (Sandbox Code Playgroud)

    certtool是 GnuTLS 的一部分。)


X.509 证书及其关联的私钥有多种格式:

  • DER是证书的 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) PRIVATE KEY”(裸密钥,OpenSSL 包围格式)。有时密钥在一个单独的.key文件中,有时它与证书捆绑在一起。

  • PKCS#12和稍旧的PFX是加密容器,存储证书和私钥(通常也是颁发者的证书)。大多数软件在使用私钥导出或“备份”证书时使用这种格式。

在 OpenPGP 中不太容易混淆的情况:所有数据都遵循相同的二进制格式,并且可以选择“装甲”(使用 Radix64 编码并在 PEM 类标头之间)。