Что такое RSA "key ID"?

Я видел ключевые идентификаторы, используемые в нескольких местах, и хотел бы использовать их в своей программе, но я не смог найти их описание. Как они генерируются?

4 ответов


в разных форматах (сертификаты PGP, SSH, X. 509) идентификатор ключа имеет разное значение. Ни SSH, ни X. 509 не имеют "выделенной" концепции идентификатора ключа, но некоторые люди используют этот термин (включая их программное обеспечение) - в этом случае это обычно хэш открытого ключа или сертификата в целом.

Update: комментарии напомнили мне, что расширения" идентификатор ключа " существуют в X. 509 certifiactes, и их иногда называют идентификаторами ключей. Но это бывает не часто - обычно хэш (также иногда называемый отпечатком пальца) упоминается как идентификатор ключа.


только что сделав это для моих собственных целей, я запишу это, пока все это свежо в моей голове...

" официальный " идентификатор ключа (то есть содержимое расширения "x509v3 Subject Key Identifier" в сертификате X509) является хэшем SHA1 ASN с кодировкой DER.1 последовательность, состоящая из модуля и экспоненты открытого ключа RSA. Для этого требуется собрать вместе около трех разных RFCs и немного экспериментов, чтобы придумать это, но вот как это завод.

некоторый код Ruby для кодирования выглядит следующим образом -- подайте ему открытый или закрытый ключ RSA на stdin:

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(':')

в случае Strongswan можно показать то, что он называет keyid С помощью утилит командной строки. Главный момент keyid это то, что его можно использовать для идентификации фактического открытого ключа, содержащегося в сертификате, чтобы сертификат мог измениться, но, проверив keyid, можно проверить, изменился ли ключ или нет.

на pki команда перечислит keyids сертификата X. 509 следующим образом (где subjectPublicKeyInfo hash - это keyid):

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

или для закрытого ключа RSA:

pki --keyid --in key.pem

вторая команда ipsec который можно использовать для перечисления всех сертификатов (и конфигурации), установленных в /etc/ipsec.d подкаталоги (эта команда перечислит сертификаты и соответствующие им keyid который такой же, как их subjectPublicKeyInfo hash перечислены ):

ipsec listall

также можно использовать openssl для генерации идеи Strongswan о keyid, который в основном является SHA1 фактического открытого ключа RSA (sed скрипт просто удаляет "- - - - - начать открытый ключ - - - - - " и конец баннеров) [исправлено после комментария Мики]:

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

"идентификатор ключа", используемый для ключа RSA в GPG/PGP, - это последние 8 шестнадцатеричных цифр модуля ключа.