2011-04-25 525 views

回答

2

以不同的格式(PGP,SSH,X.509证书)密钥ID具有不同的含义。 SSH和X.509都没有“专用”密钥ID的概念,但有些人使用这个术语(包括他们的软件) - 在这种情况下,通常是公钥或证书的散列。

更新:评论提醒我X.509 certifiactes中存在“关键标识符”扩展名,它们有时被称为关键标识。然而,这并不常见 - 通常散列(有时也称为指纹)被称为密钥ID。

+2

实际上,X是“关键标识符”的概念。509:它是一个不透明的字节序列,您可以将其包含在证书扩展中(“主题密钥标识符”);您还可以包含来自CA的密钥标识符(“授权密钥标识符”),这一点有助于建立路径。 X.509没有要求任何特定的方法来生成一个密钥标识符,它可能只是随机字节(但它使用通过公钥计算的哈希值来建立_suggests_)。密钥标识符是可选的。 – 2011-04-25 14:51:28

+0

@Thomas优秀的,谢谢你的提醒!确实存在关键标识符扩展。然而在实践中,软件所显示的和人们所引用的通常是密钥的SHA1哈希。 *指纹*是另一个同义词。 – 2011-04-25 15:46:51

1

用于GPG/PGP中RSA密钥的“密钥ID”是密钥模数的最后8位十六进制数字。

+1

其他方式来一句话:“过去的8个十六进制数字” - >“的'最后4个字节'和'密钥模数' - >'密钥的指纹(MD5或SHA-1散列)'(换行符不能工作的两个空格注释?) – Rondo 2011-10-06 01:45:44

5

刚走这样做对我自己而言,我会写下来,而它在我的头上所有新鲜...

“官方”键ID(也就是“采用X509v3主题的内容在X509证书中的“密钥标识符”扩展)是DER编码的ASN.1序列的SHA1哈希,其由RSA公钥的模数和指数组成。它需要将三个不同的RFC融合在一起并进行一些实验来提出,但这就是它的工作原理。

一些Ruby代码做编码是这样的 - 给它一个RSA公钥或私钥对标准输入:

require 'openssl' 

pkey = OpenSSL::PKey::RSA.new($stdin.read).public_key 

seq = OpenSSL::ASN1::Sequence([OpenSSL::ASN1::Integer.new(pkey.n), 
           OpenSSL::ASN1::Integer.new(pkey.e)]) 
puts Digest::SHA1.hexdigest(seq.to_der).upcase.scan(/../).join(':') 
2

Strongswan一个的情况下,可以显示它是指为keyid使用它的命令行工具。 keyid的要点是它可以用来识别证书中包含的实际公钥,以便证书可以改变,但是通过检查keyid可以检查密钥是否已经改变。

pki命令将列出的X.509证书的keyids如下(其中subjectPublicKeyInfo hashkeyid):

pki --keyid --in cert.pem --type x509 

或为RSA私钥:

pki --keyid --in key.pem 

的第二个命令是ipsec哪一个可以用来列出安装在/etc/ipsec.d子目录中的所有证书(和配置)(该命令将列出证书及其相应的keyid这是与由pki命令中列出他们的subjectPublicKeyInfo hash):

ipsec listall 

也可以使用openssl生成一个keyid的Strongswan的想法,这基本上是实际的RSA公钥的SHA1(该sed脚本只是去掉了“----- BEGIN PUBLIC KEY -----”和结束标志)[弥的评论后改正]:

openssl x509 -in cert.pem -noout -pubkey | sed 's/--.*$//g' | base64 --decode | sha1sum 
+0

写入的openssl命令不起作用。在调用sha1sum之前,必须先将base64数据解码为二进制,如下所示:'openssl x509 -in cert.pem -noout -pubkey | sed's /--.*$// g'| base64 - 解码| sha1sum' – 2018-02-11 22:11:18