我已经看过几个地方使用的密钥ID,并希望在我的程序中使用它们,但我无法找到它们的描述。它们是如何产生的?
答案 0 :(得分:7)
刚刚为了我自己的目的而做了这件事,我会把它写下来,而这一切都在我的头脑中......
“官方”密钥ID(即X509证书中“X509v3主题密钥标识符”扩展名的内容)是DER编码的ASN.1序列的SHA1哈希值,由一个模数和指数组成。 RSA公钥。它需要拼凑三个不同的RFC和一些实验来提出它,但这就是它的工作原理。
一些用于编码的Ruby代码如下所示 - 在stdin上提供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(':')
答案 1 :(得分:3)
以不同的格式(PGP,SSH,X.509证书),密钥ID具有不同的含义。 SSH和X.509都没有密钥ID的“专用”概念,但有些人使用这个术语(包括他们的软件) - 在这种情况下,它通常是公钥或整个证书的哈希。
更新:评论提醒我,X.509证书中存在“密钥标识符”扩展名,有时它们被称为密钥ID。然而,这并不常见 - 通常哈希(有时也称为指纹)被称为密钥ID。
答案 2 :(得分:2)
在Strongswan的情况下,可以使用其命令行实用程序显示它所指的keyid
。 keyid
的要点是它可用于标识证书中包含的实际公钥,以便证书可能会更改,但通过检查keyid,可以检查密钥是否已更改。
pki
命令将列出X.509证书的keyids,如下所示(subjectPublicKeyInfo hash
为keyid
):
pki --keyid --in cert.pem --type x509
或者对于RSA私钥:
pki --keyid --in key.pem
第二个命令是ipsec
,可用于列出/etc/ipsec.d
子目录中安装的所有证书(和配置)(此命令将列出证书及其对应的keyid
与subjectPublicKeyInfo hash
命令列出的pki
相同:
ipsec listall
也可以使用openssl
生成Strongswan的keyid
概念,它基本上是实际RSA公钥的SHA1(sed
脚本只是删除'--- --BEGIN公共密钥-----'和END横幅)[修正Micah的评论后]:
openssl x509 -in cert.pem -noout -pubkey | sed 's/--.*$//g' | base64 --decode | sha1sum
答案 3 :(得分:1)
GPG / PGP中用于RSA密钥的“密钥ID”是密钥模数的最后8个十六进制数字。
答案 4 :(得分:1)
当您使用 gpg 解密时,它会提供一个“长”keyID 哈希值。要验证使用了哪个密钥,请使用以下长格式列出密钥:
gpg --list-keys --keyid-format long
要在不更新默认密钥环的情况下列出不同密钥环中的密钥,请使用:
gpg --keyring <path-to-pubring.kbx> --no-default-keyring --list-keys