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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline oops1  
#1 Оставлено : 3 июня 2014 г. 10:05:41(UTC)
oops1

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

Группы: Участники
Зарегистрирован: 23.05.2014(UTC)
Сообщений: 35
Российская Федерация
Откуда: Москва

Сказал(а) «Спасибо»: 2 раз
Проблема в сабже.

Делаю запрос к SOAP сервису
Для авторизации использую сертификат администратора ARM
Этим же сертификатом подписываю запрос "SN=1ACAE47D00000000000D, RR=6, RC=Hold with test console, HD=0-0-0-10-0-0"

и отправляю в метод SubmitHoldRequest

SOAP метод мне отвечает ошибкой
"The signer is not found in the signed message"

Не понимаю что не так

в логах системы

The VB Application identified by the event source logged this Application RASupTX: Thread ID: 3948 ,Logged:
Ошибка модуля удаленного доступа к ЦР КриптоПро УЦ:
Метод: RevokeRequest.SubmitHoldRequest
Источник: RegistrationCenter
Номер: 0x80880251 (-2138570159)
Описание: The signer is not found in the signed message.

Soap error: Executing method SubmitHoldRequest failed.

Soap error: An unanticipated error occurred during the processing of this request..

http://imglink.ru/pictur...c119c30411a84fd3f8f5.jpg
Сертификаты
Offline Kirill Sobolev  
#2 Оставлено : 3 июня 2014 г. 11:00:28(UTC)
Кирилл Соболев

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

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

Поблагодарили: 177 раз в 168 постах
Судя по ошибке
Цитата:
"The signer is not found in the signed message"

Расскажите про
Цитата:
Этим же сертификатом подписываю запрос

поподробнее.
Вероятно, Вы не добавляете сертификат подписанта в сообщение.
Техническую поддержку оказываем тут
Наша база знаний
Offline oops1  
#3 Оставлено : 3 июня 2014 г. 11:03:06(UTC)
oops1

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

Группы: Участники
Зарегистрирован: 23.05.2014(UTC)
Сообщений: 35
Российская Федерация
Откуда: Москва

Сказал(а) «Спасибо»: 2 раз
Вот код который отвечает за подпись
Код:
 byte[] cert = Convert.FromBase64String(certbase64);
                var nutil = new Crypt32();

                if (!nutil.LoadAdminCertificate(AdminCertSerial))
                    throw new ApplicationException("Unable load admin certificate, serial:" + AdminCertSerial);

                var revokeRequest = nutil.GetHoldRequest(cert, (uint) period);
                byte[] s = Encoding.Unicode.GetBytes(revokeRequest);
                byte[] s1 = Encoding.Default.GetBytes(revokeRequest);
                byte[] signedData = nutil.DataSign(s, false, false);
                var signedBase64 = Convert.ToBase64String(signedData);

                var revokeClient = new RevokeRequestSoapPortClient("RevokeRequestSoapPort");
                if (revokeClient.ClientCredentials != null)
                    revokeClient.ClientCredentials.ClientCertificate.SetCertificate(StoreLocation.CurrentUser,
                        StoreName.My, X509FindType.FindBySerialNumber, AdminCertSerial);

                return revokeClient.SubmitHoldRequest(signedBase64);

Код:
String^  Crypt32::GetHoldRequest(array<unsigned char>^ certificateBinary, unsigned int period)
			{
				//CString csTemp;
				DWORD dwReason = CRL_REASON_CERTIFICATE_HOLD;

				UCHAR* chEncodinCert = new UCHAR[certificateBinary->Length];
				for (int i = 0; i < certificateBinary->Length; i++)
					chEncodinCert[i] = certificateBinary[i];
				
				//Создадим контекст сертификата
				PCCERT_CONTEXT pCert=CertCreateCertificateContext(X509_ASN_ENCODING, chEncodinCert,certificateBinary->Length);
				//Получим номер сертификата
				Text::StringBuilder^ sb = gcnew Text::StringBuilder();
				for (DWORD i=0;i<pCert->pCertInfo->SerialNumber.cbData;i++)
				{
					int t = pCert->pCertInfo->SerialNumber.pbData[pCert->pCertInfo->SerialNumber.cbData-i-1];
					sb->Append(t.ToString("X2"));

				}
				CertFreeCertificateContext(pCert);
				return String::Format("SN={0}, RR={1}, RC={2}, HD=0-0-0-{3}-0-0",sb->ToString(),dwReason,"Hold with hgg",period);
			}


Код:
			bool Crypt32::CreateDataSign(std::string algorithmPublicKey, unsigned char *pchData,DWORD dwLenData,unsigned char **pchSign, DWORD *pdwLenSign, BOOL bSignDetach, bool bIncludeCert)
			{
				if (!_adminCertLoaded)
					throw gcnew ApplicationException("Admin certificate not found");
				//Получить подпись от некотрых данных


				// Создаем и заполняем структуру для создания ц.п.
				CRYPT_SIGN_MESSAGE_PARA  SigParams;

				
				std::string csAlgIDHash = "";

				if (algorithmPublicKey == szOID_CP_GOST_R3410EL) // ГОСТ
					csAlgIDHash = szOID_CP_GOST_R3411;
				else if (algorithmPublicKey == szOID_RSA_RSA) // RSA
					csAlgIDHash = szOID_RSA_SHA1RSA;
				else 
					csAlgIDHash = szOID_CP_GOST_R3411; // По умолчанию ГОСТ

				csAlgIDHash = szOID_CP_GOST_R3411_2001;


				PCCERT_CONTEXT p = _certificateContext;
				SigParams.cbSize = sizeof(CRYPT_SIGN_MESSAGE_PARA);
				SigParams.dwMsgEncodingType = X509_ASN_ENCODING | PKCS_7_ASN_ENCODING;
				SigParams.pSigningCert = _certificateContext;
				SigParams.HashAlgorithm.pszObjId = (LPSTR)csAlgIDHash.c_str(); //szOID_CP_GOST_R3411;
				SigParams.HashAlgorithm.Parameters.cbData = NULL;
				SigParams.cMsgCert = bIncludeCert ? 1 : 0;
				SigParams.rgpMsgCert = bIncludeCert ? &(p) : NULL;
				SigParams.cAuthAttr = 0;
				SigParams.dwInnerContentType = 0;
				SigParams.cMsgCrl = 0;
				SigParams.cUnauthAttr = 0;
				SigParams.dwFlags = 0;
				SigParams.pvHashAuxInfo = NULL;
				SigParams.rgAuthAttr = NULL;

				const BYTE* MessageArray[] = {(UCHAR*)pchData};
				DWORD MessageSizeArray[1];
				MessageSizeArray[0] = dwLenData;

				// Получаем длину буфера подписи
				if(!CryptSignMessage(
					&SigParams,				// указатель на SigParams
					bSignDetach,			// подпись создается отдельно 
					1,						// число сообщений
					MessageArray,			// сообщение
					MessageSizeArray,		// длина сообщения
					NULL,		// буфер для подписи   (UCHAR*)*pchSign
					pdwLenSign))			// размер буфера
				{
					DWORD dwError=GetLastError();
					free(*pchSign);
					return false;
				}
				// выделяем память под подпись
				*pchSign = new BYTE[*pdwLenSign];
				if(*pchSign==NULL)
				{
					return false;
				}

// формируем подпись
				if(!CryptSignMessage(
					&SigParams,            // указатель на SigParams
					bSignDetach,           // подпись создается отдельно 
					1,                     // число сообщений
					MessageArray,          // сообщение
					MessageSizeArray,      // длина сообщения
					*pchSign,   // буфер для подписи
					pdwLenSign)) // размер буфера
				{
					
					delete [] *pchSign;
					return false;
				}

				

				return true;
			}

Отредактировано пользователем 3 июня 2014 г. 11:07:18(UTC)  | Причина: Не указана

Offline Kirill Sobolev  
#4 Оставлено : 3 июня 2014 г. 13:34:08(UTC)
Кирилл Соболев

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

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

Поблагодарили: 177 раз в 168 постах
Цитата:
Вот код который отвечает за подпись

В нем вообще нет вызова функции подписи.
Выложите то, что получается в переменной signedBase64 после Convert.ToBase64String(signedData).
Техническую поддержку оказываем тут
Наша база знаний
Offline oops1  
#5 Оставлено : 3 июня 2014 г. 13:35:42(UTC)
oops1

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

Группы: Участники
Зарегистрирован: 23.05.2014(UTC)
Сообщений: 35
Российская Федерация
Откуда: Москва

Сказал(а) «Спасибо»: 2 раз
Автор: Kirill Sobolev Перейти к цитате
Цитата:
Вот код который отвечает за подпись

В нем вообще нет вызова функции подписи.
Выложите то, что получается в переменной signedBase64 после Convert.ToBase64String(signedData).

А CryptSignMessage(, что делает ? если не подписывает

Код:
array<unsigned char>^ Crypt32::DataSign( array<unsigned char>^ requestData, bool bSignDetach, bool includeCertificate )
			{
				unsigned char *request  = new unsigned char[requestData->Length];
				array<unsigned char>^ signedData  = nullptr;
				try{
					for (int i = 0; i < requestData->Length; i++)
						request[i]=requestData[i];

					unsigned char *pbSignedData;
					DWORD signedDataSignLen=0;

					if (! CreateDataSign(std::string(_certificateContext->pCertInfo->SubjectPublicKeyInfo.Algorithm.pszObjId),request, requestData->Length,
						&pbSignedData,&signedDataSignLen,(BOOL)bSignDetach,(BOOL)includeCertificate))
						return nullptr;

					signedData = gcnew array<unsigned char>(signedDataSignLen);
					for(unsigned int i=0; i<signedDataSignLen;i++)
					{
						signedData[i]=pbSignedData[i];
					}
					if (signedDataSignLen > 0)
						delete[] pbSignedData;

				}finally
				{
					delete[] request;
				}

				return signedData;
			}


Код:
MIICRQYJKoZIhvcNAQcCoIICNjCCAjICAQExDDAKBgYqhQMCAgkFADALBgkqhkiG9w0BBwExggIQMIICDAIBATB5MGsxFTATBgkqhkiG9w0BCQEWBnFAcS5ydTEPMA0GA1UEBxMGTW9za293MREwDwYDVQQKEwhMZXRhUGx1czERMA8GA1UECxMIQXZhbnBvc3QxGzAZBgNVBAMTEldJTi1VUERESFJNNEVJVi1DQQIKHuoS8gAAAAAACzAKBgYqhQMCAgkFAKCCATAwGAYJKoZIhvcNAQkDMQsGCSqGSIb3DQEHATAcBgkqhkiG9w0BCQUxDxcNMTQwNjAzMDYzNzE4WjAvBgkqhkiG9w0BCQQxIgQg4ZDZUhHAZSJ3qpCUv5oqm4xkvNGweZLy4beG3bFgWM0wgcQGCyqGSIb3DQEJEAIvMYG0MIGxMIGuMIGrMAgGBiqFAwICCQQgJsccLx4bPdAZ0y2cNIhlcCsl2SPh4oVOYOR/EtM4pDswfTBvpG0wazEVMBMGCSqGSIb3DQEJARYGcUBxLnJ1MQ8wDQYDVQQHEwZNb3Nrb3cxETAPBgNVBAoTCExldGFQbHVzMREwDwYDVQQLEwhBdmFucG9zdDEbMBkGA1UEAxMSV0lOLVVQRERIUk00RUlWLUNBAgoe6hLyAAAAAAALMAoGBiqFAwICEwUABED4HDycd5ZrIm1SEOgphzz/r/cVpWq75Fn0Q+47OjuM58wXcFUabn3/zjFrsIjTCZy52fWn7xNOOetd3twifJLo

Отредактировано пользователем 3 июня 2014 г. 13:43:01(UTC)  | Причина: Не указана

Offline Kirill Sobolev  
#6 Оставлено : 3 июня 2014 г. 15:00:01(UTC)
Кирилл Соболев

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

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

Поблагодарили: 177 раз в 168 постах
CryptSignMessage у Вас вызывается внутри Crypt32::CreateDataSign.
А вызов CreateDataSign Вы не привели, хотя там 7 параметров и догадаться об их значениях при подписи запроса невозможно.
В приведенном подписанном сообщении вложенного сертификата нет, как я и говорил.
Убедиться в этом можно, например, если сохранить в файл с расширением p7b и открыть с помощью проводника Windows.
Техническую поддержку оказываем тут
Наша база знаний
Offline oops1  
#7 Оставлено : 3 июня 2014 г. 15:09:05(UTC)
oops1

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

Группы: Участники
Зарегистрирован: 23.05.2014(UTC)
Сообщений: 35
Российская Федерация
Откуда: Москва

Сказал(а) «Спасибо»: 2 раз
В руководстве программиста в пунке 3,1,4,2 ничего не сказано о том должен быть в запросе сертификат или нет. И какой в нем должен быть сертифика ?
В запросе содержится информация о том каким сертификатом подписан запрос. Есть информация о том с каким сертификатом данные отправляются на сервер.

Если сдампить запрос
Цитата:
Сведения о подписавшем[0]:
CMSG_SIGNER_INFO_PKCS_1_5_VERSION(1)
CERT_ID_ISSUER_SERIAL_NUMBER(1)
Серийный номер: 1eea12f200000000000b


Я конечно еще только начинаю разбиратся с сертификатами, но мне кажется данный тип запроса ни как не обязан содержать сертификат чтобы его можно было сохранять в файле p7b

Отредактировано пользователем 3 июня 2014 г. 15:11:06(UTC)  | Причина: Не указана

Offline oops1  
#8 Оставлено : 3 июня 2014 г. 15:24:03(UTC)
oops1

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

Группы: Участники
Зарегистрирован: 23.05.2014(UTC)
Сообщений: 35
Российская Федерация
Откуда: Москва

Сказал(а) «Спасибо»: 2 раз
Включил сертификат в запрос.
Получил сообщение

Эта операция не может быть выполнена на этом сертификате. : 1.3.6.1.5.5.7.3.1

Если я правильно понимаю это уже не хватает прав в политиках ?
Offline oops1  
#9 Оставлено : 3 июня 2014 г. 15:29:37(UTC)
oops1

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

Группы: Участники
Зарегистрирован: 23.05.2014(UTC)
Сообщений: 35
Российская Федерация
Откуда: Москва

Сказал(а) «Спасибо»: 2 раз
Kirill Sobolev, Спасибо, тему можно закрывать. Действительно , виноват сам, не включил сертификат в запрос.
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.