Статус: Активный участник
Группы: Участники
Зарегистрирован: 10.04.2008(UTC) Сообщений: 157 Откуда: Новороссийск
Поблагодарили: 14 раз в 8 постах
|
Создал самоподписанный запрос на сертификат. С помощью этого запроса создал пользователя. Последовательность такая: Цитата:hr = oDispRegistrationSoapPort.GetIDOfName(L"CreateRequestByAdmin", &dispID); if(hr!=S_OK) return 1; hr = oDispRegistrationSoapPort.InvokeN(dispID, vType,4, &vOut); if(hr!=S_OK) return 1;
dispID=long(0); hr = oDispRegistrationSoapPort.GetIDOfName(L"AcceptRequest", &dispID1); if(hr!=S_OK) return 1; vIDUser=vOut; hr = oDispRegistrationSoapPort.Invoke1(dispID1, &vIDUser, NULL); if(hr!=S_OK) return 1;
hr = oDispRegistrationSoapPort.GetIDOfName(L"CreateCertRequest", &dispID); if(hr!=S_OK) return 1; vIDUser=vOut; vOut=long(0); hr = oDispRegistrationSoapPort.Invoke1(dispID, &vIDUser, &vOut); if(hr!=S_OK) return 1; Теперь хочу одобрить запрос на сертификат. И вот тут я поймал ступор. С первым параметром все ясно. А вот со вторым я понял так. Беру свой самоподписанный запрос, подписываю его и передаю эту цепочку байт в качестве параметра. 1. Что значит подписываю? Использую функцию CryptMsgOpenToEncode или чего другое. CAPIACOM нихачу использовать. 2. Как передать эту цепочку байт? При использовании MSSOAP я не нашел понятия буфер и длина буфера.
|
|
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 25.12.2007(UTC) Сообщений: 1,733  Откуда: КРИПТО-ПРО Поблагодарили: 177 раз в 168 постах
|
1) Создаете PKCS#7, все равно как. В качестве данных для подписи берете исходный PKCS#10. Подписать конечно можно с помощью CryptoAPI, главное чтоб CAPICOM это потом смог проверить. 2) Кодируете PKCS#7 в base64 и передаете в виде строки. |
|
|
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 10.04.2008(UTC) Сообщений: 157 Откуда: Новороссийск
Поблагодарили: 14 раз в 8 постах
|
Подскажите как с помощью CryptoAPI сделать нужный PKCS#7. Хотябы пните в нужном направлении
|
|
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 25.12.2007(UTC) Сообщений: 1,733  Откуда: КРИПТО-ПРО Поблагодарили: 177 раз в 168 постах
|
|
|
|
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 10.04.2008(UTC) Сообщений: 157 Откуда: Новороссийск
Поблагодарили: 14 раз в 8 постах
|
Поюзал CryptSignMessage. Получил некий блок данных. Превел его в Base64, передал в AcceptRequest. Выдает ошибку не верное значение тега ASN.1
|
|
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 25.12.2007(UTC) Сообщений: 1,733  Откуда: КРИПТО-ПРО Поблагодарили: 177 раз в 168 постах
|
Значит неправильно получили, преобразовали в base64 или передали. Для проверки можно ту строку, которую передаете, проверить с помощью CAPICOM.SignedData. |
|
|
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 10.04.2008(UTC) Сообщений: 157 Откуда: Новороссийск
Поблагодарили: 14 раз в 8 постах
|
Нет ни какого желания вникать в CAPICOM. Тратить время и силы для того чтобы убедиться, что подпись неправельная. Вот структура Цитата: CRYPT_SIGN_MESSAGE_PARA SigParams; SigParams.cbSize = sizeof(CRYPT_SIGN_MESSAGE_PARA); SigParams.dwMsgEncodingType = (X509_ASN_ENCODING | PKCS_7_ASN_ENCODING); SigParams.pSigningCert = certContext; SigParams.HashAlgorithm.pszObjId = certContext->pCertInfo->SignatureAlgorithm.pszObjId; SigParams.HashAlgorithm.Parameters.cbData = NULL; SigParams.cMsgCert = 1; SigParams.rgpMsgCert = &certContext; SigParams.cAuthAttr = 0; SigParams.dwInnerContentType = 0; SigParams.cMsgCrl = 0; SigParams.cUnauthAttr = 0; SigParams.dwFlags = 0; SigParams.pvHashAuxInfo = NULL; SigParams.rgAuthAttr = NULL;
retBOOL=CryptSignMessage( &SigParams,FALSE,1,Data,LenData,&Sign[0],&cbSignedMessageBlob); Подписываемые данные в кодировке DER. Потом подписанные данные превоже в кодировку Base64, и передаю в AcceptRequest. Может чего в структуре не того указал?
|
|
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 25.12.2007(UTC) Сообщений: 1,733  Откуда: КРИПТО-ПРО Поблагодарили: 177 раз в 168 постах
|
Может быть (например SigParams.HashAlgorithm.pszObjId = certContext->pCertInfo->SignatureAlgorithm.pszObjId - присваивание полю "Алгоритм хэширования" значения "Алгоритм подписи сертификата".). Но вряд ли дело в этом - если функция отрабатывает без ошибок, то на выходе должен получать нормальный PKCS#7 с нормальным ASN.1. А вот что с остальными параметрами - Data,LenData,&Sign[0],&cbSignedMessageBlob? Еще можно проверить правильность base64 - сохранить получившийся base64 в файл, декодировать какой-нибудь правильной сторонней утилитой (certutil подойдет) и сравнить с исходными бинарными данными. |
|
|
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 10.04.2008(UTC) Сообщений: 157 Откуда: Новороссийск
Поблагодарили: 14 раз в 8 постах
|
Взял АРМ РКС и с помощю его проверил подпись. Все нормально, ошибок не обнаружено. Проверял как орегинальную так и в Base64. Если не указываю сертификаты для включения, тоесть Цитата:SigParams.cMsgCert = 0; SigParams.rgpMsgCert = NULL; тогда выдает ошибку в виде чесла -2138570159. Насколько я нашел это значит CAPICOM_E_SIGNER_NOT_FOUND. Не находит подпись? Но АРМ РКС все находит и проверяет. Я в конкретном тупике!
|
|
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 25.12.2007(UTC) Сообщений: 1,733  Откуда: КРИПТО-ПРО Поблагодарили: 177 раз в 168 постах
|
Цитата:Если не указываю сертификаты для включения тогда выдает ошибку в виде чесла -2138570159. так и должно быть - CAPICOM ищет сертификат подписчика только в самом сообщении. |
|
|
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close