23.05.2007 13:57:01Закрытый ключ и сертификат Ответов: 28
Александр
Я не большой специальст в шифровании.
Получил на сайте сертификат и закрытый ключ, но подписать данные с помощью сертифката не получается.
Cenroll выдает сообщение о том, что отсутствует закрытый ключ и сертификат не может использоваться для подписывания данных.
В чем проблема?
 
Ответы:
23.05.2007 17:07:59Василий
1) Для того, чтобы подписывать сертификат должен иметь ссылку на закрытый ключ. Обычно сертификат читается из хранилища "Личные" (куда он предварительно ставится со ссылкой на ключ)
2) Сертификат может быть непригоден для подписи специфических данных. Для каждой области применения есть свои идентификаторы, которые включаются в сертификат. Например, для электронной почты, для подписывания кода (исполняемых файлов).

Может, Вам проще использовать готовое решение, на выбор:
http://www.cryptopro.ru/cryptopro/products/cryptcp/default.htm

http://www.cryptopro.ru/cryptopro/products/crypto-arm/default.htm
23.05.2007 17:36:49Александр
Я уже разобрался в том что сертификат должен иметь ссылку на закрытый ключ!
Но получить сертификат с закрытым ключем на вашем сайте не возможно!
Использование стороннего (перчисляемого вами ПО) невозможно, по налагаемым на систему требованиям!
Как мне ассоциировать имеющийся ключ и сертификат?
23.05.2007 19:46:09Иван
Александр, я могу конечно ошибаться (что маловероятно), но закрытый ключ формируется на клиентской стороне (т.е. у вас на компьютере), а на серверной лишь происходит подпись, пересылаемого туда, открытого ключа с дополнительной информацией.
24.05.2007 11:42:57Василий
Все, кому нужен сертификат с закрытым ключом (для целей тестирования) могут получить их на нашим сайте:
http://www.cryptopro.ru/certsrv/certrqma.asp

при создании запроса на машине клиента делается закрытый ключ. Готовый сертификат ставится в хранилище "Личные" с привязкой к ключу (при нажатии на ссылку на следующей странице).
24.05.2007 12:51:09Александр
Василий,
Вы наверное решили писать на тему "как отвадить", ПОВТОРЯЮ!
ВАШ САЙТ НЕ ВЫДАЕТ СЕРТИФИКАТОВ С ЗАКРЫТЫМ КЛЮЧОМ!!!

Вот что он сообщает:
Произошла ошибка при создании запроса на сертификат. Проверьте, что выбранный CSP поддерживает заданные вами параметры и что введены правильные данные.
Предполагаемая причина:
(нет вариантов)
Ошибка: 0x80070002 - (нет данных)
24.05.2007 12:54:54Александр
Добавлю, что это я уже прямо замучился наблюдать, когда провайдером выбирают КРИПТО ПРО!!!!
Махание руками "как какой нибудь Дже дай" не помогает и танцы с бубном то же!
Объясните, почему Ваш крипто провайдер не выдает необходимого?
Что задекларировано в ВАШИХ документах?
24.05.2007 12:57:31Александр
Иван,
А можно чуточку подробнее?
Какие операции я должен выполнить?
Через Cenroll, что бы подписать несчастные данные?
24.05.2007 13:19:31Иван
Александр. Я не знаю на сколько изменилась ситуация с 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;
}

Затем вызываем функции ЭЦП для этого сертификата...
24.05.2007 13:23:05Василий
Александр, наш сайт работает и всё выдаёт.
Вероятно, на Вы используете какие-то неправильные настройки.
Вместо голословных утверждений лучше сообщите конфигурацию Вашего компьютера:
1) ОС, обновления
2) версия IE (надеюсь, Вы через IE заходите, остальные браузеры не катят)
3) версия, билд "КриптоПро CSP". Для 3.0 - КС1 или КС2
4) что заполняете и что выбираете на странице http://www.cryptopro.ru/certsrv/certrqma.asp



24.05.2007 14:01:22Александр
Иван, а номер аськи Ваш можно?
Или почтовый адрес.
Мне требуется подписать данные, я делаю так:
(прошу прощения, мне приходится переводить один язык программирования в 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)
24.05.2007 14:22:49Александр
Василий, я никогда не делаю голословных утверждений!
Вот вам ответы на ваши вопросы:
1) Windows XP, sp2, RAM 1Гб, НДД 150 Гб
2) IE 7 (7.0.5730.11)
3) 3.0, КС1 3.0.3300.2
4) Что заполняю:
- Имя
- email
- Организация
- Подразделение
- Город
- Страна

Тип сертификата:Сертификат подписи кода
Параметры ключа: Создать новый набор ключей
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
24.05.2007 14:24:31Иван
Александр, у вас нечто высокоуровневое описано.

Я создавал свою программу в отрыве от хранилищ сертификатов и т.п. Я использую свою внутреннюю базу сертификатов, запросы на которые и сами сертификаты получаются по другим каналам, нежели 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();
}

..........
24.05.2007 14:45:56Александр
Иван, я прошу прощения, но правильно ли я понимаю, вы не используете Провайдер Крипто Про!?
У меня провадеры Крипто про зарегистрированы под типами:
75 и 71, с 1 по 24 Это Мелкософт, 501 - Крипто Ком
24.05.2007 15:02:39Иван
Вы имеете в виду "2" ?

Я использую КриптоПро. Вместо 2 пишите 75
24.05.2007 15:33:17Kirill Sobolev
Код на VB правильный при условии что в личных 1 сертификат и он нужный.
Значит сертификат все-таки удается получить? Откуда тогда ошибка "0x80070002 - (нет данных)"?
24.05.2007 15:51:00Александр
Кирилл,
Хороший вопрос! Этот вопрос надо адресовать Крипто Про!...)))
А код на VBA работает да! ))) Но это только при условии, что сертификат выдан кем угодно, НО ТОЛЬКО не Крипто Про! :)
Будь моя воля я конечно дано бы плюнул на этот крипто провайдер, вот только клиент уперся, хочу только Крипто Про и все... А тут такая засада...)))
24.05.2007 16:01:29Иван
Александр, Кирилл говорит о том, что Вам необходимо проверить тот ли именно сертификат находит Ваш код (может у вас там их великое множество) и предназначен ли он для вашей задачи.

Вы проверяли это?

Я генерировал неоднократно сертификаты через сервер КриптоПро. Последние даже через Windows Mobile для установки SSL/TLS соединений с двойной аутентификацией.
24.05.2007 16:17:20Александр
Иван, да сертификат именно тот, строку:
CertForSign = Store.Certificates.Item(1) Привел, как показатель того, как идет обращение к сертификату.
Естественно подписывающий сертификат не первый и не единственный в системе.
В системе зарегистрированы сертификаты:
МелкоСофта (провайдер мелкософт) Работает,
КриптоПро (провайдер мелкософт) Работает,
КриптоПро (Провайдер крипто про) НЕ РАБОТАЕТ,
КриптоПро (Провайдер крипто про) НЕ РАБОТАЕТ
24.05.2007 16:33:50Kirill Sobolev
А каким образом тогда Вам удалось получить и установить гостовый сертификат если через сайт КриптоПро Вам это не удается?
24.05.2007 19:04:51Василий
Александр, тут в обсуждении про типы CSP я увидел, что тип Крипто Ком. Это значит, что он установлен на этой машине?
Или нет?
Можно уточнить, какие вообще CSP установлены?
Если не затруднит, скиньте содержимое разделов:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\Defaults\Provider Types
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\Defaults\Provider

И второе - какой считыватель настроен в КриптоПро CSP, создаётся ли на нём ключевой контейнер при создании запроса на сертификат?
25.05.2007 11:41:35Александр
Василий,
Да, крипто провайдер Крипто Ком установлен!
Практически, все перечисленные ранее крипто провайдеры, собственно, я их перечислил выше.
Вы думаете, что из за Провайдера Крипто Ком не работает Ваш?
Это не так! Просто потому, что я уже в течении пары недель бьюсь с Вашим провайдером, да и вообще с крипто защитой.
Пришлось вспомнить то, чем занимался в университете.
Защитой кода, как с носителем, так и без оного, с шифрованием без него, защитой от трассировки и обходом этих вставок.
Так что, могу сказать, что к вашему провайдеру никакого отношения крипто ком не имеет!
25.05.2007 11:50:15Василий
> Так что, могу сказать, что к вашему провайдеру никакого отношения крипто ком не имеет!

Вот уж не факт...

Вы можете удалить Крипто Ком и посмотреть, как без него?

Или на другой машине поставьте только КриптоПро CSP...
25.05.2007 12:28:32Александр
Василий, мы опять возвращаемся к тому что было сказано выше!
"Я не делаю голословных утверждений!" (см. выше.)
Крипто провайдер Крипто про был установлен вчера утром!
До этого его, как сами понимаете не было!
Но это Абсолютно не влияло на описанный мною выше результат!
Запрос на создание сертификата создается.
Контейнер ключа создается.
А вот сертификат все равно, либо приходит без ключа, либо не создается!
25.05.2007 12:34:49Василий
Сообщите значения полей имени пользователя, которые Вы вводили при создании конкретного запроса и примерное время - я посмотрю на сервере, поступал ли такой запрос и был ли сделан сертификат по этому запросу.

По поводу - что сертификат не приходит.
После создания запроса и его отправки IE автоматически переходит на страницу установки сертификата? Если да, может, Вы не дожидаетесь полного окончания её загрузки?
25.05.2007 14:02:36Александр
Василий,
Пожалуйста внимательно перечитайте сообщения в данном разделе.
Если я дожидаюсь сообщения об ошибке создания, значит, времени затрачено на это не мало.
Вы смеетесь?
Выдать всю поднаготную?
А потом менять адрес корпоративной почты?
Максимум что я вам могу дать, так это наименование фирмы:
Компьютерные технологии
25.05.2007 15:39:57Василий
Есть один сертификат, содержащий в названии организации такие слова.
Выдан 24-го мая, 12:58, ключ RSA.

Неудачных запросов с таким названием организации нет.

Вывод - запрос на сервер не приходил. Стало быть, проблема на конкретной клиентской машине - не удаётся создать запрос на сертификат.
Так что не надо писать "ВАШ САЙТ НЕ ВЫДАЕТ СЕРТИФИКАТОВ С ЗАКРЫТЫМ КЛЮЧОМ!!!"
Можно прокомментировать: "сертификат все равно... приходит без ключа" - как же он приходит, если он не был издан?
Или всё-таки на другое название организации?
25.05.2007 17:59:23Александр
Василий,
Повторю еще раз:
Произошла ошибка при создании запроса на сертификат. Проверьте, что выбранный CSP поддерживает заданные вами параметры и что введены правильные данные.
Предполагаемая причина:
(нет вариантов)
Ошибка: 0x80070002 - (нет данных)
25.05.2007 20:26:29Василий
Честно говоря, не понял какая связь между сообщёнными Вами фактами "Ошибка при создании запроса на сертификат" и "Сертификат приходит без ключа"...

Почему возникает ошибка при создании запроса конкретно на Вашем компьютере - неясно. Для уточнения недостаточно данных (если вообще возможно это сделать в рамках форума).

Для Вас есть два пути решения проблемы:
1) более лёгкий - потребует от 1 до 2 часов. Ставите на свободный раздел (с форматированием) WinXP с SP2 с оригинального дистрибутива. Ставите, если есть желание, критические обновления от MS. Потом "КриптоПро CSP 3.0 с SP2".

2) более сложный - потребует от вас заключения с ООО "Крипто-Про" договора технического сопровождения, и, в рамках названного договора будем проводить работы. Возможно, потребуется выезд нашего специалиста к вам. По стоимости можете уточнить в нашем коммерческом отделе.