| ||||
| ||||
Я не большой специальст в шифровании. Получил на сайте сертификат и закрытый ключ, но подписать данные с помощью сертифката не получается. Cenroll выдает сообщение о том, что отсутствует закрытый ключ и сертификат не может использоваться для подписывания данных. В чем проблема? | ||||
Ответы: | ||||
| ||||
1) Для того, чтобы подписывать сертификат должен иметь ссылку на закрытый ключ. Обычно сертификат читается из хранилища "Личные" (куда он предварительно ставится со ссылкой на ключ) 2) Сертификат может быть непригоден для подписи специфических данных. Для каждой области применения есть свои идентификаторы, которые включаются в сертификат. Например, для электронной почты, для подписывания кода (исполняемых файлов). Может, Вам проще использовать готовое решение, на выбор: http://www.cryptopro.ru/cryptopro/products/cryptcp/default.htm http://www.cryptopro.ru/cryptopro/products/crypto-arm/default.htm | ||||
| ||||
Я уже разобрался в том что сертификат должен иметь ссылку на закрытый ключ! Но получить сертификат с закрытым ключем на вашем сайте не возможно! Использование стороннего (перчисляемого вами ПО) невозможно, по налагаемым на систему требованиям! Как мне ассоциировать имеющийся ключ и сертификат? | ||||
| ||||
Александр, я могу конечно ошибаться (что маловероятно), но закрытый ключ формируется на клиентской стороне (т.е. у вас на компьютере), а на серверной лишь происходит подпись, пересылаемого туда, открытого ключа с дополнительной информацией. | ||||
| ||||
Все, кому нужен сертификат с закрытым ключом (для целей тестирования) могут получить их на нашим сайте: http://www.cryptopro.ru/certsrv/certrqma.asp при создании запроса на машине клиента делается закрытый ключ. Готовый сертификат ставится в хранилище "Личные" с привязкой к ключу (при нажатии на ссылку на следующей странице). | ||||
| ||||
Василий, Вы наверное решили писать на тему "как отвадить", ПОВТОРЯЮ! ВАШ САЙТ НЕ ВЫДАЕТ СЕРТИФИКАТОВ С ЗАКРЫТЫМ КЛЮЧОМ!!! Вот что он сообщает: Произошла ошибка при создании запроса на сертификат. Проверьте, что выбранный CSP поддерживает заданные вами параметры и что введены правильные данные. Предполагаемая причина: (нет вариантов) Ошибка: 0x80070002 - (нет данных) | ||||
| ||||
Добавлю, что это я уже прямо замучился наблюдать, когда провайдером выбирают КРИПТО ПРО!!!! Махание руками "как какой нибудь Дже дай" не помогает и танцы с бубном то же! Объясните, почему Ваш крипто провайдер не выдает необходимого? Что задекларировано в ВАШИХ документах? | ||||
| ||||
Иван, А можно чуточку подробнее? Какие операции я должен выполнить? Через Cenroll, что бы подписать несчастные данные? | ||||
| ||||
Александр. Я не знаю на сколько изменилась ситуация с CSP, но в версии 2.0 (опять же, если я не ошибаюсь) единственный вариант получения сертификата выглядит так: Вы на своём компьютере либо программно с помощью Cenroll, либо через Web-интерфейс генерируете ключевую пару (закрытый + открытый ключи), далее открытый ключ с дополнительной инфой пересылается на Сервер Сертификации, где всё это подписывается корневым сертификатом. Затем, вы получаете этот сертификат. И его необходимо связать с соответствующим закрытым ключом. В случае Web-интерфейса это происходит автоматически (я проверял неоднократно), в случае программной реализации - необходимо привязать закрытый ключ к этому сертификату самостоятельно. Вот как-то так я делал это: //--------------------------------------------------------------------------- // получим дескриптор провайдера (и секретного ключа) для подписи PCCERT_CONTEXT __fastcall Tcrtmgr_win::GetSignKey( AnsiString asGUID, HCRYPTPROV* phCryptProv ) { AnsiString asContainerName; int NumRows, err, i, rez = -1; PCCERT_CONTEXT pCertContext = NULL; CRYPT_SIGN_MESSAGE_PARA SigParams; //HCRYPTPROV hProv; DWORD dwKeySpec; BOOL fCallerFreeProv; // ------------- for( i=0; i < pCertList->Count; i++ ) if( AnsiString( ((ptCards_Store)(pCertList->Items[i]))->guid ) == asGUID ) rez = i; if( rez != -1 ) { asContainerName = AnsiString( ((ptCards_Store)(pCertList->Items[rez]))->conteiner ); } else { return NULL; } //-------------------------------------------------------------------- CRYPT_KEY_PROV_INFO provInfo; pCertContext = GetCertContext( asGUID ); err = CryptFindCertificateKeyProvInfo( pCertContext, 0, NULL); if( !err) { //Получаем UNICODE-уникальное имя контейнера provInfo.pwszContainerName = WideString( asContainerName ).c_bstr(); //Получаем UNICODE-имя провайдера provInfo.pwszProvName = WideString( crtmgr_win->tCrypto.asProviderName ).c_bstr(); //Получаем тип провайдера: provInfo.dwProvType = 2; provInfo.dwFlags = 0; provInfo.cProvParam = 0; provInfo.rgProvParam = 0; provInfo.dwKeySpec = AT_SIGNATURE; CertSetCertificateContextProperty( pCertContext, CERT_KEY_PROV_INFO_PROP_ID, 0, &provInfo ); } if( !CryptAcquireCertificatePrivateKey( pCertContext, CRYPT_ACQUIRE_COMPARE_KEY_FLAG | CRYPT_ACQUIRE_SILENT_FLAG, NULL, phCryptProv/*&hProv*/, &dwKeySpec, &fCallerFreeProv )) { err =GetLastError(); } return pCertContext; } Затем вызываем функции ЭЦП для этого сертификата... | ||||
| ||||
Александр, наш сайт работает и всё выдаёт. Вероятно, на Вы используете какие-то неправильные настройки. Вместо голословных утверждений лучше сообщите конфигурацию Вашего компьютера: 1) ОС, обновления 2) версия IE (надеюсь, Вы через IE заходите, остальные браузеры не катят) 3) версия, билд "КриптоПро CSP". Для 3.0 - КС1 или КС2 4) что заполняете и что выбираете на странице http://www.cryptopro.ru/certsrv/certrqma.asp | ||||
| ||||
Иван, а номер аськи Ваш можно? Или почтовый адрес. Мне требуется подписать данные, я делаю так: (прошу прощения, мне приходится переводить один язык программирования в VBA (как более близкий), может ошибусь в чем то) Dim CertStore as Capicom.Store Dim SertForSign as Capicom.Certificate Dim DataForSign as Capicom.SignedData Dim Signer as Capicom.Signer CertStore = New Capicom.Store CertStore.Open SertForSign = CertStore.Certificates(1) DataForSign = New Capicom.SignedData Signer = New Capicom.Signer Data = Что то что подписываем Signer.Certificate = SertForSign DataForSign.Content = Data SignedData = DataForSign.Sign(Signer,False,0) | ||||
| ||||
Василий, я никогда не делаю голословных утверждений! Вот вам ответы на ваши вопросы: 1) Windows XP, sp2, RAM 1Гб, НДД 150 Гб 2) IE 7 (7.0.5730.11) 3) 3.0, КС1 3.0.3300.2 4) Что заполняю: - Имя - Организация - Подразделение - Город - Страна Тип сертификата:Сертификат подписи кода Параметры ключа: Создать новый набор ключей CSP: Crypto-Pro GOST К 34.10-2001 Cryptographic Service Provider Использование ключей: Оба Размер ключа:512 Автоматическое имя контейнера PKCS 10 GOST R 34.11-94 что заполняете и что выбираете на странице http://www.cryptopro.ru/certsrv/certrqma.asp | ||||
| ||||
Александр, у вас нечто высокоуровневое описано. Я создавал свою программу в отрыве от хранилищ сертификатов и т.п. Я использую свою внутреннюю базу сертификатов, запросы на которые и сами сертификаты получаются по другим каналам, нежели Web. Поэтому у меня возникла необходимость привязывать сертификат к закр. ключу. Для этого необходимо всего лишь знать точное имя крипто-контейнера и выполнить часть кода, описанную выше. Cenroll я использовал только для выдачи запроса на сертификат. Всё остальное - CryptoAPI .......... const BYTE* MessageArray[] = {chBuffer}; DWORD MessageSizeArray[1]; MessageSizeArray[0] = iBufferSize; //-------------------------------------------------------------------- // Initialize the signature structure. SigParams.cbSize = sizeof(CRYPT_SIGN_MESSAGE_PARA); SigParams.dwMsgEncodingType = PKCS_7_ASN_ENCODING | X509_ASN_ENCODING; SigParams.pSigningCert = pCertContext; // szOID_OIWSEC_sha1RSASign // szOID_OIWSEC_sha1 // szOID_OIWSEC_sha // if( iSignMode == 0 ) SigParams.HashAlgorithm.pszObjId = szOID_CP_GOST_R3411_R3410; if( iSignMode == 1 ) SigParams.HashAlgorithm.pszObjId = szOID_OIWSEC_sha1RSASign; SigParams.HashAlgorithm.Parameters.cbData = NULL; SigParams.cMsgCert = 0; SigParams.rgpMsgCert = NULL; SigParams.cAuthAttr = 0; SigParams.dwInnerContentType = 0; SigParams.cMsgCrl = 0; SigParams.cUnauthAttr = 0; SigParams.dwFlags = 0; SigParams.pvHashAuxInfo = NULL; SigParams.rgAuthAttr = NULL; //-------------------------------------------------------------------- // With two calls to CryptSignMessage, sign the message. // First, get the size of the output signed BLOB. if(CryptSignMessage( &SigParams, // Signature parameters TRUE, // detached 1, // Number of messages MessageArray, // Messages to be signed MessageSizeArray, // Size of messages chSignedData, // Buffer for signed message pdwSigLen)) // Size of buffer { err= 1; } else { err = GetLastError(); } .......... | ||||
| ||||
Иван, я прошу прощения, но правильно ли я понимаю, вы не используете Провайдер Крипто Про!? У меня провадеры Крипто про зарегистрированы под типами: 75 и 71, с 1 по 24 Это Мелкософт, 501 - Крипто Ком | ||||
| ||||
Вы имеете в виду "2" ? Я использую КриптоПро. Вместо 2 пишите 75 | ||||
| ||||
Код на VB правильный при условии что в личных 1 сертификат и он нужный. Значит сертификат все-таки удается получить? Откуда тогда ошибка "0x80070002 - (нет данных)"? | ||||
| ||||
Кирилл, Хороший вопрос! Этот вопрос надо адресовать Крипто Про!...))) А код на VBA работает да! ))) Но это только при условии, что сертификат выдан кем угодно, НО ТОЛЬКО не Крипто Про! :) Будь моя воля я конечно дано бы плюнул на этот крипто провайдер, вот только клиент уперся, хочу только Крипто Про и все... А тут такая засада...))) | ||||
| ||||
Александр, Кирилл говорит о том, что Вам необходимо проверить тот ли именно сертификат находит Ваш код (может у вас там их великое множество) и предназначен ли он для вашей задачи. Вы проверяли это? Я генерировал неоднократно сертификаты через сервер КриптоПро. Последние даже через Windows Mobile для установки SSL/TLS соединений с двойной аутентификацией. | ||||
| ||||
Иван, да сертификат именно тот, строку: CertForSign = Store.Certificates.Item(1) Привел, как показатель того, как идет обращение к сертификату. Естественно подписывающий сертификат не первый и не единственный в системе. В системе зарегистрированы сертификаты: МелкоСофта (провайдер мелкософт) Работает, КриптоПро (провайдер мелкософт) Работает, КриптоПро (Провайдер крипто про) НЕ РАБОТАЕТ, КриптоПро (Провайдер крипто про) НЕ РАБОТАЕТ | ||||
| ||||
А каким образом тогда Вам удалось получить и установить гостовый сертификат если через сайт КриптоПро Вам это не удается? | ||||
| ||||
Александр, тут в обсуждении про типы CSP я увидел, что тип Крипто Ком. Это значит, что он установлен на этой машине? Или нет? Можно уточнить, какие вообще CSP установлены? Если не затруднит, скиньте содержимое разделов: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\Defaults\Provider Types HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\Defaults\Provider И второе - какой считыватель настроен в КриптоПро CSP, создаётся ли на нём ключевой контейнер при создании запроса на сертификат? | ||||
| ||||
Василий, Да, крипто провайдер Крипто Ком установлен! Практически, все перечисленные ранее крипто провайдеры, собственно, я их перечислил выше. Вы думаете, что из за Провайдера Крипто Ком не работает Ваш? Это не так! Просто потому, что я уже в течении пары недель бьюсь с Вашим провайдером, да и вообще с крипто защитой. Пришлось вспомнить то, чем занимался в университете. Защитой кода, как с носителем, так и без оного, с шифрованием без него, защитой от трассировки и обходом этих вставок. Так что, могу сказать, что к вашему провайдеру никакого отношения крипто ком не имеет! | ||||
| ||||
> Так что, могу сказать, что к вашему провайдеру никакого отношения крипто ком не имеет! Вот уж не факт... Вы можете удалить Крипто Ком и посмотреть, как без него? Или на другой машине поставьте только КриптоПро CSP... | ||||
| ||||
Василий, мы опять возвращаемся к тому что было сказано выше! "Я не делаю голословных утверждений!" (см. выше.) Крипто провайдер Крипто про был установлен вчера утром! До этого его, как сами понимаете не было! Но это Абсолютно не влияло на описанный мною выше результат! Запрос на создание сертификата создается. Контейнер ключа создается. А вот сертификат все равно, либо приходит без ключа, либо не создается! | ||||
| ||||
Сообщите значения полей имени пользователя, которые Вы вводили при создании конкретного запроса и примерное время - я посмотрю на сервере, поступал ли такой запрос и был ли сделан сертификат по этому запросу. По поводу - что сертификат не приходит. После создания запроса и его отправки IE автоматически переходит на страницу установки сертификата? Если да, может, Вы не дожидаетесь полного окончания её загрузки? | ||||
| ||||
Василий, Пожалуйста внимательно перечитайте сообщения в данном разделе. Если я дожидаюсь сообщения об ошибке создания, значит, времени затрачено на это не мало. Вы смеетесь? Выдать всю поднаготную? А потом менять адрес корпоративной почты? Максимум что я вам могу дать, так это наименование фирмы: Компьютерные технологии | ||||
| ||||
Есть один сертификат, содержащий в названии организации такие слова. Выдан 24-го мая, 12:58, ключ RSA. Неудачных запросов с таким названием организации нет. Вывод - запрос на сервер не приходил. Стало быть, проблема на конкретной клиентской машине - не удаётся создать запрос на сертификат. Так что не надо писать "ВАШ САЙТ НЕ ВЫДАЕТ СЕРТИФИКАТОВ С ЗАКРЫТЫМ КЛЮЧОМ!!!" Можно прокомментировать: "сертификат все равно... приходит без ключа" - как же он приходит, если он не был издан? Или всё-таки на другое название организации? | ||||
| ||||
Василий, Повторю еще раз: Произошла ошибка при создании запроса на сертификат. Проверьте, что выбранный CSP поддерживает заданные вами параметры и что введены правильные данные. Предполагаемая причина: (нет вариантов) Ошибка: 0x80070002 - (нет данных) | ||||
| ||||
Честно говоря, не понял какая связь между сообщёнными Вами фактами "Ошибка при создании запроса на сертификат" и "Сертификат приходит без ключа"... Почему возникает ошибка при создании запроса конкретно на Вашем компьютере - неясно. Для уточнения недостаточно данных (если вообще возможно это сделать в рамках форума). Для Вас есть два пути решения проблемы: 1) более лёгкий - потребует от 1 до 2 часов. Ставите на свободный раздел (с форматированием) WinXP с SP2 с оригинального дистрибутива. Ставите, если есть желание, критические обновления от MS. Потом "КриптоПро CSP 3.0 с SP2". 2) более сложный - потребует от вас заключения с ООО "Крипто-Про" договора технического сопровождения, и, в рамках названного договора будем проводить работы. Возможно, потребуется выезд нашего специалиста к вам. По стоимости можете уточнить в нашем коммерческом отделе. | ||||