Ключевое слово в защите информации
ключевое слово
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

2 Страницы12>
Опции
К последнему сообщению К первому непрочитанному
Offline Wissenkrieger  
#1 Оставлено : 7 февраля 2012 г. 0:59:41(UTC)
Wissenkrieger

Статус: Участник

Группы: Участники
Зарегистрирован: 25.11.2010(UTC)
Сообщений: 11

Доброго времени суток. Появилась необходимость научиться вычислять по запросу сертификата его идентификатор ключа субъекта.
Если сдампить запрос сертификата (ну или сам сертификат) утилитой certutil, в конце всегда видим строки вида:
Хеш ИД ключа (rfc-sha1): какой-то хеш
Хеш ИД ключа (sha1): какой-то ДРУГОЙ хеш

Один из них и есть пресловутый "Идентификатор ключа субъекта" в будущем сертификате.
Тот что rfc-sha1 вычислить труда не составило - берём открытый ключ и считаем от него SHA1-хеш. Но прикол в том, что в выданном сертификате идентификатором ключа субъекта оказывается второй - Хеш ИД ключа (sha1). Но как же его вычислить? Я перепробовал кучу вариантов, хешируя всё и вся, и окончательно сломал мозг. Знает ли кто-нибудь, как рассчитать идентификатор ключа субъекта из запроса? И чем вообще эти два хеша отличаются?
Offline Юрий  
#2 Оставлено : 7 февраля 2012 г. 8:56:54(UTC)
Юрий

Статус: Активный участник

Группы: Участники
Зарегистрирован: 22.01.2008(UTC)
Сообщений: 675
Мужчина
Российская Федерация
Откуда: Йошкар-Ола

Сказал «Спасибо»: 3 раз
Поблагодарили: 95 раз в 68 постах
А литературой то какой пользуетесь или только мозг ломаете? :)
Рекомендую все же найти стандарт на запросы на сертификат и почитать его.
С уважением,
Юрий Строжевский
Offline Kirill Sobolev  
#3 Оставлено : 7 февраля 2012 г. 13:10:58(UTC)
Кирилл Соболев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 25.12.2007(UTC)
Сообщений: 1,733
Мужчина
Откуда: КРИПТО-ПРО

Поблагодарили: 177 раз в 168 постах
Цитата:
Тот что rfc-sha1 вычислить труда не составило - берём открытый ключ и считаем от него SHA1-хеш.

Каким образом Вы его считаете?
Техническую поддержку оказываем тут
Наша база знаний
Offline Wissenkrieger  
#4 Оставлено : 8 февраля 2012 г. 1:01:06(UTC)
Wissenkrieger

Статус: Участник

Группы: Участники
Зарегистрирован: 25.11.2010(UTC)
Сообщений: 11

Цитата:
А литературой то какой пользуетесь или только мозг ломаете? :)

Ну естественно. RFC наше всё, в моём случае это RFC 5280, описывающий структуру сертификата. В частности, пункт 4.2.1.2. Subject Key Identifier. Там описаны два способа вычисления идентификатора ключа субъекта. Применение первого способа даёт Хеш ИД ключа (rfc-sha1). Второй же способ заранее не годится, потому что предусматривает начальные биты 0100 и общую длину всего 64 бита, в то время как certutil показывает другие начальные биты и полноценный размер в 160 бит. В RFC, описывающих структуру PKCS10 - запроса на сертификат ( RFC 2314, RFC 2986, RFC 5967 ), информация о том, как вычислять идентификатор ключа субъекта, отсутствует.

Цитата:
Каким образом Вы его считаете?

Да как все честные люди. :) Беру запрос сертификата в виде PKCS10-данных и яростно парсю его с помощью CryptDecodeObject до получения PCERT_REQUEST_INFO, из которого вынимаю SubjectPublicKeyInfo.PublicKey - открытый ключик. Затем скармливаю содержимое оного ключа в связку CryptCreateHash - CryptHashData - CryptGetHashParam, не забывая указать хендл нашего любимого криптопровайдера и желаемый алгоритм CALG_SHA1. В результате благородный КриптоПро 3.6 вычисляет для меня SHA1-хеш (спасибо ему, ибо мне самому реализовывать хеширование как-то лень :) ). Этот хеш в точности совпадает с Хеш ИД ключа (rfc-sha1), выдаваемым certutil. Но это НЕ идентификатор ключа субъекта!

Как же волшебная cerutil считает этот (sha1) хеш? Не дизассемблировать же её в самом деле... разгадка должна быть где-то рядом, но где?..

Отредактировано пользователем 8 февраля 2012 г. 1:08:57(UTC)  | Причина: Не указана

Offline Андрей Писарев  
#5 Оставлено : 8 февраля 2012 г. 2:34:41(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 14,087
Мужчина
Российская Федерация

Сказал «Спасибо»: 612 раз
Поблагодарили: 2375 раз в 1868 постах
Покажу наглядно и в картинках :)


для запроса на сертификат:
certutil -dump c:\test\1.p10 >c:\test\1.p10.log
Цитата:

Запрос сертификата PKCS10
...
Подпись соответствует открытому ключу
Хеш ИД ключа (rfc-sha1): 9b 88 5d 45 51 6c 58 39 25 fe 8a d0 f5 94 ef 70 97 31 97 31
Хеш ИД ключа (sha1): 2c ec 05 fa 80 dc c4 98 86 ce 65 88 b0 fb e2 fb d2 b3 b6 eb
ИД ключа субъекта (вычисленный): c8 24 d2 83 3c 07 bf ff 95 ca 78 17 f7 ba 00 b4 de 76 3f cd



для выданного сертификата:
certutil -dump c:\test\1.cer >c:\test\1.log
Цитата:

Сертификат X509
....
Не корневой сертификат
Хеш ИД ключа (rfc-sha1): 9b 88 5d 45 51 6c 58 39 25 fe 8a d0 f5 94 ef 70 97 31 97 31
Хеш ИД ключа (sha1): 2c ec 05 fa 80 dc c4 98 86 ce 65 88 b0 fb e2 fb d2 b3 b6 eb
ИД ключа субъекта (вычисленный): c8 24 d2 83 3c 07 bf ff 95 ca 78 17 f7 ba 00 b4 de 76 3f cd
Хеш сертификата(md5): dd cc 2a 01 81 a0 41 f3 6f 60 91 8e 31 24 dc 22
Хеш сертификата(sha1): 3d 97 2a d2 6b 74 98 6d eb b5 84 f7 1c 9b 3b 5d 2a 37 4e cd


UserPostedImage


Отредактировано пользователем 8 февраля 2012 г. 4:51:01(UTC)  | Причина: Не указана

Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей Писарев  
#6 Оставлено : 8 февраля 2012 г. 4:05:25(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 14,087
Мужчина
Российская Федерация

Сказал «Спасибо»: 612 раз
Поблагодарили: 2375 раз в 1868 постах
Далее :

UserPostedImage

Сам Открытый ключ (64 байта) в hex виде:
D6F3473FC186523CE95CAEFC07ADBFC666F9332BBA813C04C09BC44365970FFC2917F64FFC906A3326FEF650BBB98B6D38F3E74309F9BC4DA468E7BD341BF603

sha1 от тех 64х байт = 512 бит : Anxious
F833003A9A532928FD8A4D7913D5610DC8752B25

Т.е. не совпадает "пока" с c8 24 d2 83 3c 07 bf ff 95 ca 78 17 f7 ba 00 b4 de 76 3f cd Anxious



ЕСЛИ ВЗЯТЬ (0440 + ОК ), 0440D6F3473FC186523CE95CAEFC07ADBFC666F9332BBA813C04C09BC44365970FFC2917F64FFC906A3326FEF650BBB98B6D38F3E74309F9BC4DA468E7BD341BF603
sha1 = 9B885D45516C583925FE8AD0F594EF7097319731 = Хеш ИД ключа (rfc-sha1)

но никак не... c8 24 d2 83 3c 07 bf ff 95 ca 78 17 f7 ba 00 b4 de 76 3f cd

Программно :
szOID_SUBJECT_KEY_IDENTIFIER :
2.5.29.14: Идентификатор ключа субъекта = c8 24 d2 83 3c 07 bf ff 95 ca 78 17 f7 ba 00 b4 de 76 3f cd





Отредактировано пользователем 8 февраля 2012 г. 4:51:26(UTC)  | Причина: Не указана

Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей Писарев  
#7 Оставлено : 8 февраля 2012 г. 4:27:12(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 14,087
Мужчина
Российская Федерация

Сказал «Спасибо»: 612 раз
Поблагодарили: 2375 раз в 1868 постах
Wissenkrieger написал:
Kirill Sobolev написал:
Каким образом Вы его считаете?


Да как все честные люди. :) Беру запрос сертификата в виде PKCS10-данных и яростно парсю его с помощью CryptDecodeObject до получения PCERT_REQUEST_INFO, из которого вынимаю SubjectPublicKeyInfo.PublicKey - открытый ключик. Затем скармливаю содержимое оного ключа в связку CryptCreateHash - CryptHashData - CryptGetHashParam, не забывая указать хендл нашего любимого криптопровайдера и желаемый алгоритм CALG_SHA1. В результате благородный КриптоПро 3.6 вычисляет для меня SHA1-хеш (спасибо ему, ибо мне самому реализовывать хеширование как-то лень :) ). Этот хеш в точности совпадает с Хеш ИД ключа (rfc-sha1), выдаваемым certutil. Но это НЕ идентификатор ключа субъекта!




Итого, а может так:
Цитата:
A key identifier is the unique identifier of a public/private key pair.
It can be any unique identifier but is usually the 20-byte SHA1 hash of an encoded CERT_PUBLIC_KEY_INFO structure.


Anxious


и ...
BOOL WINAPI CryptHashPublicKeyInfo(
__in HCRYPTPROV_LEGACY hCryptProv,
__in ALG_ID Algid,
__in DWORD dwFlags,
__in DWORD dwCertEncodingType,
__in PCERT_PUBLIC_KEY_INFO pInfo,
__out BYTE *pbComputedHash,
__inout DWORD *pcbComputedHash
);


осталось проверить ...

Отредактировано пользователем 8 февраля 2012 г. 4:33:43(UTC)  | Причина: Не указана

Техническую поддержку оказываем тут
Наша база знаний
Offline Kirill Sobolev  
#8 Оставлено : 8 февраля 2012 г. 14:08:36(UTC)
Кирилл Соболев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 25.12.2007(UTC)
Сообщений: 1,733
Мужчина
Откуда: КРИПТО-ПРО

Поблагодарили: 177 раз в 168 постах
Цитата:
Беру запрос сертификата в виде PKCS10-данных и яростно парсю его с помощью CryptDecodeObject до получения PCERT_REQUEST_INFO, из которого вынимаю SubjectPublicKeyInfo.PublicKey - открытый ключик. Затем скармливаю содержимое оного ключа в связку CryptCreateHash - CryptHashData - CryptGetHashParam, не забывая указать хендл нашего любимого криптопровайдера и желаемый алгоритм CALG_SHA1.

Я думаю, что содержимое которое Вы передаете - это только bit string, т.е. Вы считаете SKID в точности по рекомендации RFC5280.
Цитата:
CryptHashPublicKeyInfo

А вот эта функция берет хеш от всей закодированной структуры. Certutil тоже ей пользуется.
Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей Писарев  
#9 Оставлено : 8 февраля 2012 г. 14:15:46(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 14,087
Мужчина
Российская Федерация

Сказал «Спасибо»: 612 раз
Поблагодарили: 2375 раз в 1868 постах
Kirill Sobolev написал:
Цитата:
Беру запрос сертификата в виде PKCS10-данных и яростно парсю его с помощью CryptDecodeObject до получения PCERT_REQUEST_INFO, из которого вынимаю SubjectPublicKeyInfo.PublicKey - открытый ключик. Затем скармливаю содержимое оного ключа в связку CryptCreateHash - CryptHashData - CryptGetHashParam, не забывая указать хендл нашего любимого криптопровайдера и желаемый алгоритм CALG_SHA1.

Я думаю, что содержимое которое Вы передаете - это только bit string, т.е. Вы считаете SKID в точности по рекомендации RFC5280.
Цитата:
CryptHashPublicKeyInfo

А вот эта функция берет хеш от всей закодированной структуры. Certutil тоже ей пользуется.


Цитата:
А вот эта функция берет хеш от всей закодированной структуры. Certutil тоже ей пользуется.


Значит - в итоге будет идентификатор субъекта?

update:

вот нашел Anxious

http://www.cryptopro.ru/...ro/forum/view.asp?q=2367

Цитата:
02.02.2006 12:49:41 Как получить идентификатор ключа субъекта Ответов: 1
Ельнар
Всем привет.
Помогите
Как получить идентификатор ключа субъекта с помощью CryptoAPI

Ответы:
02.02.2006 13:55:12 Kirill Sobolev
Посмотрите функцию CryptHashPublicKeyInfo

Отредактировано пользователем 8 февраля 2012 г. 14:44:54(UTC)  | Причина: Не указана

Техническую поддержку оказываем тут
Наша база знаний
Offline Wissenkrieger  
#10 Оставлено : 9 февраля 2012 г. 1:40:45(UTC)
Wissenkrieger

Статус: Участник

Группы: Участники
Зарегистрирован: 25.11.2010(UTC)
Сообщений: 11

Андрей *
Да, вот и я также мозг ломал, пытаясь подсовывать в хеш-функцию то сам ключ, то вместе с соседними служебными байтами в различных комбинациях, и всё было бестолку.

Цитата:
CryptHashPublicKeyInfo

O_O
Как же это я умудрился пройти мимо такой вкусной функции... Вот она! Вот она функция моей мечты! Посчитала Хеш ИД ключа (sha1) сразу и без хлопот. Надо впредь внимательнее шерстить MSDN...

Большое спасибо за подсказки! Applause
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
2 Страницы12>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.