29.01.2004 18:11:17Signature в PKCS 10 Ответов: 10
aktz
Всем привет!.
У меня возник вопрос по поводу заявки на сертификат, получаемой при помощи Microsoft CA, в формате PKCS#10.
При просмотре заявки с помощью certutil.exe, практически все поля подаются расшифровке, используя BER и DER. Но вот в поле “Signature” написано что-то непонятное. При этом выдается сообщение: “Подпись не соответствует открытому ключу”. Вопрос, что храниться в поле «Signature»? Если структура, то какая? Если она закодирована, то как CertUtil.exe её декодирует? Если он её не декодирует, то на каком основании он утверждает, что подпись не соответствует открытому ключу.
 
Ответы:
30.01.2004 10:08:24kure
Посмотрите формат запроса
http://www.ietf.org/rfc/rfc2314.txt

CertificationRequest ::= SEQUENCE {
certificationRequestInfo CertificationRequestInfo,
signatureAlgorithm SignatureAlgorithmIdentifier,
signature Signature }

SignatureAlgorithmIdentifier ::= AlgorithmIdentifier

Signature ::= BIT STRING

Подпись это битовая последовательность.
Если пишет что подпись не соответствует открытому ключу, значит подпись не верна.
30.01.2004 11:09:52aktz
Гм. То что это BIT STRING я читал. Но вопрос возник вот почему. Если верить BER, то BIT STRING имеет таг 03. И при просмотре PKCS10 файла все аттрибуты кроме подписи на эти самые таги раскладываются. То есть если посмотреть на файл сформированный с помощью крипто-про, то в аттрибуте "CSP заявки" структура BER прослеживается, а в подписи нет. Вот это мне и непонятно.
30.01.2004 13:01:15kure
Переименуйте запрос в файл с расширением b64.
Winzip его распаковывает в бинарный.
Через dumpasn1 получаем

<30 0A 06 06 2A 85 03 02 02 03 05 00>
640 30 10: SEQUENCE {
<06 06 2A 85 03 02 02 03>
642 06 6: OBJECT IDENTIFIER &rsquo;1 2 643 2 2 3&rsquo;
<05 00>
650 05 0: NULL
: }
<03 41 00 85 48 D6 74 1F 6C A2 A7 8B 4F 9F 10 A2 A6 E8 2A C2 FB 04 93 97>
652 03 65: BIT STRING 0 unused bits
: 85 48 D6 74 1F 6C A2 A7 8B 4F 9F 10 A2 A6 E8 2A
: C2 FB 04 93 97 90 9D CA D4 1C 37 3F B4 0E 95 72
: 32 FC DE 87 EC 5E 71 AB 78 56 E2 FE 9A E7 22 2C
: 79 92 22 5E 66 8C B2 08 00 F5 E6 C6 C1 DF 4E C6
: }
30.01.2004 17:21:52aktz
Посмотрел я файлик с помощью dumpasn1 ну вроде что-то похожее, если не считать что подпись записана в порядке обратном тому, как её показывает certutil. Вопрос у меня вот какой:
насколько я знаю подпись это закодированные с помощью закрытого ключа
значение хэша, OID&rsquo;а алгоритма и еще какой-то информации. Как certutil её декодирует(или на основании чего он может утверждать что моя подпись не соответствует открытому ключу)? Контекст моего CSP не запрашивается.
30.01.2004 17:46:09kure
Certutil вызывает cryptoapi, тот в свою очередь необходимый CSP.
30.01.2004 18:14:15aktz
Ситуация такова:
Я написал свой CSP.
И пытаюсь с помощью него выдать запрос на сертификат у MS CA. Там есть опция сохранить в файл PKCS 10. Сохраняю, смотрю certutil.exe. Он мне и говорит про вышеупомянутую ошибку. При этом контекст моего CSP точно не берется.
Может я что не так зарегистрировал? Какая нужна информация для того, чтобы все правильно отработало?
30.01.2004 18:24:15kure
На форуме не возможно рассказать как написать провайдер.
Посмотрите MSDN, http://discuss.microsoft.com/archives/index.html
31.01.2004 0:03:02aktz
Ладно поставим вопрос по другому:)
Запускаю все тот же злополучный certutil.exe c файлом запроса на сертификат. Одновременно смотрю с помощью RegMonitora какие обращения идут к реестру. И после обращения к разделу CryptDllFormatObject идет обращение сразу к разделу, где описан тип провайдера.

certutil.exe OpenKey HKLM\SOFTWARE\Microsoft\Cryptography\Defaults\Provider Types\Type 001 certutil.exe QueryValue HKLM\SOFTWARE\Microsoft\Cryptography\Defaults\Provider Types\Type 001\Name SUCCESS "Microsoft Strong Cryptographic Provider"

Храниться ли информация о типе провайдера в запросе?

Это кажется мне странным так, как в файле запроса есть имя провайдера, почему оно не используется?

PS отправить к MSDN проще всего. Я думаю, если бы там было все написано на этом форуме было бы вопросов гораздо меньше:)
02.02.2004 14:31:08kure
У вас провайдер тип 1.
Так?

Сколько таких провайдеров на компьютере(такого типа) установлено.

А на другом компьютере его может и не быть (вашего).

Поэтому есть еще понятье default provider.


02.02.2004 14:34:20aktz
тип у него не 1, а 25:)
да и какая разница какого он типа?