Answers:
SSH密钥只是普通的RSA,DSA或ECDSA非对称密钥对。由OpenSSH生成的这种密钥对已经可以被OpenSSL和大多数其他程序使用。
(.pub
输出的文件ssh-keygen
是OpenSSH特定的格式,但这无关紧要,因为“私有”文件已经包含私有密钥和公共密钥。)
其他SSH软件可能具有自己的存储格式,例如RFC 4716或PuTTY的PPK,但是它们存储相同的RSA / DSA / ECDSA信息。
X.509(由SSL,S / MIME使用)稍微复杂一些:“私钥”仍然是相同的,但是没有裸露的公钥文件,而是有一个“证书” –包含A.1结构的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证书”的复杂结构,其中包含:
所有密钥对都有失效日期和使用位:签名数据,认证(签名)密钥,加密,对服务进行身份验证。默认情况下,主密钥具有“签名”和“认证”位,第一个子密钥是“加密”。如果添加“身份验证”子项,则可以将其gpg-agent
用于SSH身份验证。
要查看您的证书包含什么:
gpg --export joe@example.com | gpg -vv
gpg --export joe@example.com | certtool --pgp-certificate-info
(certtool
是GnuTLS的一部分。)
X.509证书及其关联的私钥有几种格式:
DER是证书的ASN.1结构的二进制编码。此类文件通常具有.crt
或.cer
文件扩展名(.der
不常见,但不可见)。
“ PEM”格式文件包含相同的DER编码数据,但还使用Base64在“ BEGIN THIS”和“ END THAT”头之间进行了编码。一个常见的文件扩展名是.pem
,虽然两者.crt
并.cer
有时也在这里(但从未使用.der
)。
对于属于证书的私钥,通常使用“ PEM”格式–由标头“ BEGIN PRIVATE KEY”(PKCS#7结构中的密钥)或“ BEGIN RSA (或DSA) PRIVATE KEY”(裸露的密钥,OpenSSL )包围的Base64 格式)。有时,密钥在单独的.key
文件中,有时与证书捆绑在一起。
PKCS#12和较旧的PFX是加密的容器,既存储证书又存储私钥(通常也是发行者的证书)。大多数软件在使用私钥导出或“备份”证书时都会使用此格式。
在OpenPGP中,情况不太混乱:所有数据都遵循相同的二进制格式,并且可以选择“装甲”(用Radix64编码,并在类似PEM的标头之间编码)。
以不同的位置和不同的格式存储(PGP,GnuPG ssh
和PGP所使用的格式以及几种不同的X.509格式都存在很大差异)。有可能在它们之间转码在一定程度上通过混合和匹配的权利选项ssh-keygen
,pgp
,gpg
/ gpg2
,openssl
等; 但总的来说,这是不值得的。此外,不同的密钥格式支持不同数量的信息,ssh
携带最少的额外信息,而X.509 PEM和DER格式携带最多的信息。此外,OSX钥匙串只是加密的钥匙/值存储,因此每个应用程序通常需要不同的机制来在程序的本机钥匙+元数据格式与可以存储在钥匙串中的东西之间进行转换。(类似的担忧也适用于KDE钱包和GNOME钥匙串。)