| ||||
| ||||
Всем привет!. У меня возник вопрос по поводу заявки на сертификат, получаемой при помощи Microsoft CA, в формате PKCS#10. При просмотре заявки с помощью certutil.exe, практически все поля подаются расшифровке, используя BER и DER. Но вот в поле “Signature” написано что-то непонятное. При этом выдается сообщение: “Подпись не соответствует открытому ключу”. Вопрос, что храниться в поле «Signature»? Если структура, то какая? Если она закодирована, то как CertUtil.exe её декодирует? Если он её не декодирует, то на каком основании он утверждает, что подпись не соответствует открытому ключу. | ||||
Ответы: | ||||
| ||||
Посмотрите формат запроса http://www.ietf.org/rfc/rfc2314.txt CertificationRequest ::= SEQUENCE { certificationRequestInfo CertificationRequestInfo, signatureAlgorithm SignatureAlgorithmIdentifier, signature Signature } SignatureAlgorithmIdentifier ::= AlgorithmIdentifier Signature ::= BIT STRING Подпись это битовая последовательность. Если пишет что подпись не соответствует открытому ключу, значит подпись не верна. | ||||
| ||||
Гм. То что это BIT STRING я читал. Но вопрос возник вот почему. Если верить BER, то BIT STRING имеет таг 03. И при просмотре PKCS10 файла все аттрибуты кроме подписи на эти самые таги раскладываются. То есть если посмотреть на файл сформированный с помощью крипто-про, то в аттрибуте "CSP заявки" структура BER прослеживается, а в подписи нет. Вот это мне и непонятно. | ||||
| ||||
Переименуйте запрос в файл с расширением 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 ’1 2 643 2 2 3’ <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 : } | ||||
| ||||
Посмотрел я файлик с помощью dumpasn1 ну вроде что-то похожее, если не считать что подпись записана в порядке обратном тому, как её показывает certutil. Вопрос у меня вот какой: насколько я знаю подпись это закодированные с помощью закрытого ключа значение хэша, OID’а алгоритма и еще какой-то информации. Как certutil её декодирует(или на основании чего он может утверждать что моя подпись не соответствует открытому ключу)? Контекст моего CSP не запрашивается. | ||||
| ||||
Certutil вызывает cryptoapi, тот в свою очередь необходимый CSP. | ||||
| ||||
Ситуация такова: Я написал свой CSP. И пытаюсь с помощью него выдать запрос на сертификат у MS CA. Там есть опция сохранить в файл PKCS 10. Сохраняю, смотрю certutil.exe. Он мне и говорит про вышеупомянутую ошибку. При этом контекст моего CSP точно не берется. Может я что не так зарегистрировал? Какая нужна информация для того, чтобы все правильно отработало? | ||||
| ||||
На форуме не возможно рассказать как написать провайдер. Посмотрите MSDN, http://discuss.microsoft.com/archives/index.html | ||||
| ||||
Ладно поставим вопрос по другому:) Запускаю все тот же злополучный 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 проще всего. Я думаю, если бы там было все написано на этом форуме было бы вопросов гораздо меньше:) | ||||
| ||||
У вас провайдер тип 1. Так? Сколько таких провайдеров на компьютере(такого типа) установлено. А на другом компьютере его может и не быть (вашего). Поэтому есть еще понятье default provider. | ||||
| ||||
тип у него не 1, а 25:) да и какая разница какого он типа? | ||||