Ключевое слово в защите информации
ключевое слово
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход. Новые регистрации запрещены.

Уведомление

Icon
Error

2 Страницы12>
Опции
К последнему сообщению К первому непрочитанному
Offline Dim  
#1 Оставлено : 2 апреля 2009 г. 18:58:43(UTC)
Dim

Статус: Активный участник

Группы: Участники
Зарегистрирован: 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 я не нашел понятия буфер и длина буфера.
Offline Kirill Sobolev  
#2 Оставлено : 2 апреля 2009 г. 19:37:43(UTC)
Кирилл Соболев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 25.12.2007(UTC)
Сообщений: 1,733
Мужчина
Откуда: КРИПТО-ПРО

Поблагодарили: 177 раз в 168 постах
1) Создаете PKCS#7, все равно как. В качестве данных для подписи берете исходный PKCS#10. Подписать конечно можно с помощью CryptoAPI, главное чтоб CAPICOM это потом смог проверить.
2) Кодируете PKCS#7 в base64 и передаете в виде строки.
Техническую поддержку оказываем тут
Наша база знаний
Offline Dim  
#3 Оставлено : 2 апреля 2009 г. 20:36:42(UTC)
Dim

Статус: Активный участник

Группы: Участники
Зарегистрирован: 10.04.2008(UTC)
Сообщений: 157
Откуда: Новороссийск

Поблагодарили: 14 раз в 8 постах
Подскажите как с помощью CryptoAPI сделать нужный PKCS#7. Хотябы пните в нужном направлении
Offline Kirill Sobolev  
#4 Оставлено : 2 апреля 2009 г. 20:56:50(UTC)
Кирилл Соболев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 25.12.2007(UTC)
Сообщений: 1,733
Мужчина
Откуда: КРИПТО-ПРО

Поблагодарили: 177 раз в 168 постах
CryptSignMessage
Техническую поддержку оказываем тут
Наша база знаний
Offline Dim  
#5 Оставлено : 2 апреля 2009 г. 21:57:11(UTC)
Dim

Статус: Активный участник

Группы: Участники
Зарегистрирован: 10.04.2008(UTC)
Сообщений: 157
Откуда: Новороссийск

Поблагодарили: 14 раз в 8 постах
Поюзал CryptSignMessage. Получил некий блок данных. Превел его в Base64, передал в AcceptRequest. Выдает ошибку не верное значение тега ASN.1
Offline Kirill Sobolev  
#6 Оставлено : 3 апреля 2009 г. 15:12:09(UTC)
Кирилл Соболев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 25.12.2007(UTC)
Сообщений: 1,733
Мужчина
Откуда: КРИПТО-ПРО

Поблагодарили: 177 раз в 168 постах
Значит неправильно получили, преобразовали в base64 или передали. Для проверки можно ту строку, которую передаете, проверить с помощью CAPICOM.SignedData.
Техническую поддержку оказываем тут
Наша база знаний
Offline Dim  
#7 Оставлено : 3 апреля 2009 г. 16:10:37(UTC)
Dim

Статус: Активный участник

Группы: Участники
Зарегистрирован: 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.
Может чего в структуре не того указал?
Offline Kirill Sobolev  
#8 Оставлено : 3 апреля 2009 г. 17:42:47(UTC)
Кирилл Соболев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 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 подойдет) и сравнить с исходными бинарными данными.
Техническую поддержку оказываем тут
Наша база знаний
Offline Dim  
#9 Оставлено : 3 апреля 2009 г. 19:25:59(UTC)
Dim

Статус: Активный участник

Группы: Участники
Зарегистрирован: 10.04.2008(UTC)
Сообщений: 157
Откуда: Новороссийск

Поблагодарили: 14 раз в 8 постах
Взял АРМ РКС и с помощю его проверил подпись. Все нормально, ошибок не обнаружено.
Проверял как орегинальную так и в Base64.
Если не указываю сертификаты для включения, тоесть
Цитата:
SigParams.cMsgCert = 0;
SigParams.rgpMsgCert = NULL;

тогда выдает ошибку в виде чесла -2138570159. Насколько я нашел это значит CAPICOM_E_SIGNER_NOT_FOUND. Не находит подпись? Но АРМ РКС все находит и проверяет. Я в конкретном тупике!
Offline Kirill Sobolev  
#10 Оставлено : 3 апреля 2009 г. 19:45:41(UTC)
Кирилл Соболев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 25.12.2007(UTC)
Сообщений: 1,733
Мужчина
Откуда: КРИПТО-ПРО

Поблагодарили: 177 раз в 168 постах
Цитата:
Если не указываю сертификаты для включения
тогда выдает ошибку в виде чесла -2138570159.

так и должно быть - CAPICOM ищет сертификат подписчика только в самом сообщении.
Техническую поддержку оказываем тут
Наша база знаний
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
2 Страницы12>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.