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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline manigu  
#1 Оставлено : 28 августа 2014 г. 17:12:51(UTC)
manigu

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

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

Сказал(а) «Спасибо»: 21 раз
Здравствуйте, криптоАРМ не принимает запрос на сертификат.

Вот функция в которой создаю запрос на сертификат.
Код:

char* createRequest() {
		size_t i;
		char *UserName_C = new char[100];
		wcstombs_s(&i, UserName_C, (size_t)100, CommonName, (size_t)100);

		/*
		CERT_RDN_ATTR rgNameAttr[] = {
			"2.5.4.3",                             // pszObjId 
			CERT_RDN_PRINTABLE_STRING,             // dwValueType
			strlen(UserName_C),             // value.cbData
			(BYTE*)UserName_C };
			*/

		CERT_RDN_ATTR *rgNameAttr = new CERT_RDN_ATTR[6];//DN_count];
		
		rgNameAttr[0].pszObjId = "2.5.4.3";
		rgNameAttr[0].dwValueType = CERT_RDN_PRINTABLE_STRING;
		rgNameAttr[0].Value.cbData = strlen(UserName_C);
		rgNameAttr[0].Value.pbData = (BYTE*)UserName_C;
		
		rgNameAttr[1].pszObjId = "2.5.4.6";
		rgNameAttr[1].dwValueType = CERT_RDN_PRINTABLE_STRING;
		rgNameAttr[1].Value.cbData = strlen("RU");
		rgNameAttr[1].Value.pbData = (BYTE*)"RU";

		rgNameAttr[2].pszObjId = "2.5.4.7";
		rgNameAttr[2].dwValueType = CERT_RDN_PRINTABLE_STRING;
		rgNameAttr[2].Value.cbData = strlen("Moscow");
		rgNameAttr[2].Value.pbData = (BYTE*)"Moscow";
		
		rgNameAttr[3].pszObjId = "2.5.4.8";
		rgNameAttr[3].dwValueType = CERT_RDN_PRINTABLE_STRING;
		rgNameAttr[3].Value.cbData = strlen("Russia");
		rgNameAttr[3].Value.pbData = (BYTE*)"Russia";

		rgNameAttr[4].pszObjId = "2.5.4.10";
		rgNameAttr[4].dwValueType = CERT_RDN_PRINTABLE_STRING;
		rgNameAttr[4].Value.cbData = strlen("Roga i Kopita");
		rgNameAttr[4].Value.pbData = (BYTE*)"Roga i Kopita";
		
		rgNameAttr[5].pszObjId = "1.2.840.113549.1.9.1";
		rgNameAttr[5].dwValueType = CERT_RDN_PRINTABLE_STRING;
		rgNameAttr[5].Value.cbData = strlen("email@test.com");
		rgNameAttr[5].Value.pbData = (BYTE*)"email@test.com";
		

		CERT_RDN rgRDN[] = {6, &rgNameAttr[0]};
		CERT_NAME_INFO Name = {1, rgRDN};

		CERT_REQUEST_INFO  CertReqInfo;
		CERT_NAME_BLOB  SubjNameBlob;
		DWORD  cbNameEncoded;
		BYTE*  pbNameEncoded;
		DWORD  cbPublicKeyInfo;
		CERT_PUBLIC_KEY_INFO*  pbPublicKeyInfo;
		DWORD  cbEncodedCertReqSize;
		CRYPT_OBJID_BLOB  Parameters;
		CRYPT_ALGORITHM_IDENTIFIER  SigAlg;
		BYTE*  pbSignedEncodedCertReq;
		char*  pSignedEncodedCertReqBlob;

		if (CryptEncodeObject(
			MY_ENCODING_TYPE,     // Encoding type
			X509_NAME,            // Structure type
			&Name,                // Address of CERT_NAME_INFO structure
			NULL,                 // pbEncoded
			&cbNameEncoded))      // pbEncoded size
		{
			printf("The first call to CryptEncodeObject succeeded. \n");
		}
		else
		{
			HandleError("The first call to CryptEncodeObject failed. \nA public/private key pair may not exit in the container. \n");
		}

		if (!(pbNameEncoded = (BYTE*)malloc(cbNameEncoded)))
			HandleError("The pbNamencoded malloc operation failed. \n");
		
		if (CryptEncodeObject(
			MY_ENCODING_TYPE,    // Encoding type
			X509_NAME,           // Structure type
			&Name,               // Address of CERT_NAME_INFO structure
			pbNameEncoded,       // pbEncoded
			&cbNameEncoded))     // pbEncoded size
		{
			printf("The object is encoded. \n");
		}
		else
		{
			free(pbNameEncoded);
			HandleError("The second call to CryptEncodeObject failed. \n");
		}

		SubjNameBlob.cbData = cbNameEncoded;
		SubjNameBlob.pbData = pbNameEncoded;
		CertReqInfo.Subject = SubjNameBlob;

		CertReqInfo.cAttribute = 0;
		CertReqInfo.rgAttribute = NULL;
		CertReqInfo.dwVersion = CERT_REQUEST_V1;

		//!!!!!!!!!!!!!!!!!!!!!!
		if (CryptAcquireContext(
			&hCryptProv,        // Address for handle to be returned.
			CommonName,               // Use the current user's logon name.
			ProviderName,               // Use the default provider.
			75,      // Need to both encrypt and sign.
			NULL))              // No flags needed.
		{
			printf("A cryptographic provider has been acquired. \n");
		}
		else
		{
			free(pbNameEncoded);
			HandleError("CryptAcquireContext failed. \n");
		}
		
		if (CryptExportPublicKeyInfo(
			hCryptProv,            // Provider handle
			AT_KEYEXCHANGE,          // Key spec
			MY_ENCODING_TYPE,      // Encoding type
			NULL,                  // pbPublicKeyInfo
			&cbPublicKeyInfo))     // Size of PublicKeyInfo
		{
			printf("The keyinfo structure is %d bytes. \n", cbPublicKeyInfo);
		}
		else
		{
			free(pbNameEncoded);
			HandleError("The first call to CryptExportPublickKeyInfo failed. \nThe probable cause is that \nthere is no key pair in the key container. \n");
		}

		if (pbPublicKeyInfo = (CERT_PUBLIC_KEY_INFO*)malloc(cbPublicKeyInfo))
		{
			printf("Memory is allocated for the public key structure. \n");
		}
		else
		{
			free(pbNameEncoded);
			HandleError("Memory allocation failed. \n");
		}

		if (CryptExportPublicKeyInfo(
			hCryptProv,            // Provider handle
			AT_KEYEXCHANGE,          // Key spec
			MY_ENCODING_TYPE,      // Encoding type
			pbPublicKeyInfo,       // pbPublicKeyInfo
			&cbPublicKeyInfo))     // Size of PublicKeyInfo
		{
			printf("The key has been exported. \n");
		}
		else
		{
			free(pbNameEncoded);
			free(pbPublicKeyInfo);
			HandleError("The second call to CryptExportPublicKeyInfo failed. \n");
		}

		CertReqInfo.SubjectPublicKeyInfo = *pbPublicKeyInfo;

		memset(&Parameters, 0, sizeof(Parameters));
		SigAlg.pszObjId = szOID_CP_GOST_R3411;
		SigAlg.Parameters = Parameters;

		if (CryptSignAndEncodeCertificate(
			hCryptProv,                      // Crypto provider
			AT_KEYEXCHANGE,                  // Key spec
			MY_ENCODING_TYPE,                // Encoding type
			X509_CERT_REQUEST_TO_BE_SIGNED,  // Structure type
			&CertReqInfo,                    // Structure information
			&SigAlg,                         // Signature algorithm
			NULL,                            // Not used
			NULL,                            // pbSignedEncodedCertReq
			&cbEncodedCertReqSize))          // Size of certificate 
		{
			printf("The size of the encoded certificate is set. \n");
		}
		else
		{
			free(pbNameEncoded);
			free(pbPublicKeyInfo);
			HandleError("First call to CryptSignandEncode failed. \n");
		}

		if (pbSignedEncodedCertReq = (BYTE*)malloc(cbEncodedCertReqSize))
		{
			printf("Memory has been allocated.\n");
		}
		else
		{
			free(pbNameEncoded);
			free(pbPublicKeyInfo);
			HandleError("The malloc operation failed. \n");
		}

		if (CryptSignAndEncodeCertificate(
			hCryptProv,                     // Crypto provider
			AT_KEYEXCHANGE,                 // Key spec
			MY_ENCODING_TYPE,               // Encoding type
			X509_CERT_REQUEST_TO_BE_SIGNED, // Struct type
			&CertReqInfo,                   // Struct info        
			&SigAlg,                        // Signature algorithm
			NULL,                           // Not used
			pbSignedEncodedCertReq,         // Pointer
			&cbEncodedCertReqSize))         // Length of the message
		{
			printf("The message is encoded and signed. \n");
		}
		else
		{
			free(pbNameEncoded);
			free(pbPublicKeyInfo);
			free(pbSignedEncodedCertReq);
			HandleError("The second call to CryptSignAndEncode failed. \n");
		}

		pSignedEncodedCertReqBlob = new char[(cbEncodedCertReqSize * 2) + 1];

		ByteToStr(cbEncodedCertReqSize, pbSignedEncodedCertReq, pSignedEncodedCertReqBlob);

		printf("The string created is: \n");
		printf("%s\n", pSignedEncodedCertReqBlob);

		free(pbNameEncoded);
		free(pbPublicKeyInfo);
		free(pbSignedEncodedCertReq);
		CryptReleaseContext(hCryptProv, 0);

		printf("\nMemory freed. Program ran without error. \n");

		return pSignedEncodedCertReqBlob;
	}


На выходе получаю.
Код:

308201053081D3020100306731653007060355040313003009060355040613025255300D060355040713064D6F73636F77300D060355040813065275737369613014060355040A130D526F67612069204B6F70697461301B06092A864886F70D010901130E656D61696C40746573742E636F6D3063301C06062A8503020213301206072A85030202240006072A850302021E0103430004403CCE610E308F0C13DA22271A834CA7389972A5771F79068325D6D4709921966E2D52ADC9BF0B4228519A12824D26C805AA391444E41DF9EE6607B0BBAA6C8537A000300A06062A850302020905000321009B32F4F950E910CB8FA5C48D4E935F64DDA89FEE0E3EAA59B0D5BA3BFFE50F51


Далее перевожу в base64.
Код:

static const std::string base64_chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

static inline bool is_base64(unsigned char c) {
	return (isalnum(c) || (c == '+') || (c == '/'));
}

std::string base64_encode(char* bytes_to_encode, unsigned int in_len) {
	std::string ret;
	int block = 0;
	int i = 0;
	int j = 0;
	unsigned char char_array_3[3];
	unsigned char char_array_4[4];

	while (in_len--) {
		char_array_3[i++] = *(bytes_to_encode++);
		if (i == 3) {
			char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
			char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
			char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);
			char_array_4[3] = char_array_3[2] & 0x3f;

			for (i = 0; (i < 4); i++) {
				ret += base64_chars[char_array_4[i]];
				block++;

				if (block == 64) {
					ret += '\n';
					block = 0;
				}
			}
			i = 0;
		}
	}

	if (i) {
		for (j = i; j < 3; j++) {
			char_array_3[j] = '\0';
		}

		char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
		char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
		char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);
		char_array_4[3] = char_array_3[2] & 0x3f;

		for (j = 0; (j < i + 1); j++) {
			ret += base64_chars[char_array_4[j]];
		}
	}

	return ret += "=\n";
}


И получаю вот такой запрос, который не принимается АРМ.
Код:

MzA4MjAxMDUzMDgxRDMwMjAxMDAzMDY3MzE2NTMwMDcwNjAzNTUwNDAzMTMwMDMw
MDkwNjAzNTUwNDA2MTMwMjUyNTUzMDBEMDYwMzU1MDQwNzEzMDY0RDZGNzM2MzZG
NzczMDBEMDYwMzU1MDQwODEzMDY1Mjc1NzM3MzY5NjEzMDE0MDYwMzU1MDQwQTEz
MEQ1MjZGNjc2MTIwNjkyMDRCNkY3MDY5NzQ2MTMwMUIwNjA5MkE4NjQ4ODZGNzBE
MDEwOTAxMTMwRTY1NkQ2MTY5NkM0MDc0NjU3Mzc0MkU2MzZGNkQzMDYzMzAxQzA2
MDYyQTg1MDMwMjAyMTMzMDEyMDYwNzJBODUwMzAyMDIyNDAwMDYwNzJBODUwMzAy
MDIxRTAxMDM0MzAwMDQ0MDNDQ0U2MTBFMzA4RjBDMTNEQTIyMjcxQTgzNENBNzM4
OTk3MkE1NzcxRjc5MDY4MzI1RDZENDcwOTkyMTk2NkUyRDUyQURDOUJGMEI0MjI4
NTE5QTEyODI0RDI2QzgwNUFBMzkxNDQ0RTQxREY5RUU2NjA3QjBCQkFBNkM4NTM3
QTAwMDMwMEEwNjA2MkE4NTAzMDIwMjA5MDUwMDAzMjEwMDlCMzJGNEY5NTBFOTEw
Q0I4RkE1QzQ4RDRFOTM1RjY0RERBODlGRUUwRTNFQUE1OUIwRDVCQTNCRkZFNTBG
NTE=


АРМ выдаёт следующую ошибку.
Код:

Номер: 	-2147220992
Источник: 	GetRequestPKCS
Описание: 	Неправильный формат запроса


Может я где-то что-то упустил или сделал не так, подскажите пожалуйста.

Offline Андрей Писарев  
#2 Оставлено : 28 августа 2014 г. 18:31:35(UTC)
Андрей *

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

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

Сказал «Спасибо»: 621 раз
Поблагодарили: 2397 раз в 1886 постах
Цитата:
И получаю вот такой запрос, который не принимается АРМ.

Код не смотрел, быстрее было декодировать из base64 и понять, что там вместо запроса:
Цитата:
308201053081D3020100306... и далее

как результат использования: ByteToStr


Проблема вот здесь:
Код:

pSignedEncodedCertReqBlob = new char[(cbEncodedCertReqSize * 2) + 1];
 ByteToStr(cbEncodedCertReqSize, pbSignedEncodedCertReq, pSignedEncodedCertReqBlob);
 


pbSignedEncodedCertReq - нужно записать в файл, размер файла получится = cbEncodedCertReqSize
это и будет запрос на сертификат
Техническую поддержку оказываем тут
Наша база знаний
thanks 1 пользователь поблагодарил Андрей * за этот пост.
manigu оставлено 02.09.2014(UTC)
Offline manigu  
#3 Оставлено : 1 сентября 2014 г. 12:38:50(UTC)
manigu

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

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

Сказал(а) «Спасибо»: 21 раз
Автор: Андрей * Перейти к цитате
Цитата:
И получаю вот такой запрос, который не принимается АРМ.

Код не смотрел, быстрее было декодировать из base64 и понять, что там вместо запроса:
Цитата:
308201053081D3020100306... и далее

как результат использования: ByteToStr


Проблема вот здесь:
Код:

pSignedEncodedCertReqBlob = new char[(cbEncodedCertReqSize * 2) + 1];
 ByteToStr(cbEncodedCertReqSize, pbSignedEncodedCertReq, pSignedEncodedCertReqBlob);
 


pbSignedEncodedCertReq - нужно записать в файл, размер файла получится = cbEncodedCertReqSize
это и будет запрос на сертификат


Записал pbSignedEncodedCertReq в файл.

Код:

bool writeToFile(char* path, byte* cert, DWORD size) {
	FILE* output;
	fopen_s(&output, "d:\\test_0.req", "wb");
	fwrite(cert, sizeof(size), size, output);
	fclose(output);

	return true;
}


В файле.

Код:

оюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюоюою5°8K†d 8 Fx%D             З   ээээНННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННээээ««««««««ю        wІ8Ќd x%D    ¬[Кn:         К   ээээоННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННН


На всякий случай попробовал открыть в АРМ, выдает такую же ошибку.
Offline manigu  
#4 Оставлено : 1 сентября 2014 г. 12:46:51(UTC)
manigu

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

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

Сказал(а) «Спасибо»: 21 раз
Исправил функцию, но всё равно в файле получаю подобную строку, как написал выше.

Код:

bool writeToFile(char* path, byte* cert, DWORD size) {
	FILE* output;
	fopen_s(&output, "d:\\test_0.req", "wb");
	fwrite(cert, sizeof(size), size/sizeof(size), output);
	fclose(output);

	return true;
}
Offline Kirill Sobolev  
#5 Оставлено : 1 сентября 2014 г. 14:00:09(UTC)
Кирилл Соболев

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

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

Поблагодарили: 177 раз в 168 постах
Код:
fwrite(cert, sizeof(size), size/sizeof(size), output);

Странная конструкция. А если size некратно 4?
Используйте
Код:
fwrite(cert, sizeof(byte), size, output);

или
Код:
fwrite(cert, size, 1, output);

Цитата:
В файле.

Лучше прикреплять вложением к сообщению.

Техническую поддержку оказываем тут
Наша база знаний
thanks 1 пользователь поблагодарил Кирилл Соболев за этот пост.
manigu оставлено 02.09.2014(UTC)
Offline manigu  
#6 Оставлено : 2 сентября 2014 г. 9:49:41(UTC)
manigu

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

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

Сказал(а) «Спасибо»: 21 раз
Автор: Kirill Sobolev Перейти к цитате
Код:
fwrite(cert, sizeof(size), size/sizeof(size), output);

Странная конструкция. А если size некратно 4?
Используйте
Код:
fwrite(cert, sizeof(byte), size, output);

или
Код:
fwrite(cert, size, 1, output);

Цитата:
В файле.

Лучше прикреплять вложением к сообщению.



Изменил как Вы посоветовали, файл получился размером = cbEncodedCertReqSize.

Но это по-прежнему не похоже на запрос.

Отредактировано пользователем 2 сентября 2014 г. 9:51:02(UTC)  | Причина: Не указана

Вложение(я):
test_0.txt (1kb) загружен 5 раз(а).

У Вас нет прав для просмотра или загрузки вложений. Попробуйте зарегистрироваться.
Offline Kirill Sobolev  
#7 Оставлено : 2 сентября 2014 г. 12:18:57(UTC)
Кирилл Соболев

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

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

Поблагодарили: 177 раз в 168 постах
У меня Ваш код отрабатывает нормально.
Отличия - вставил вызов
Код:
writeToFile(NULL, pbSignedEncodedCertReq, cbEncodedCertReqSize);

вместо
Код:
pSignedEncodedCertReqBlob = new char[(cbEncodedCertReqSize * 2) + 1];
,
алгоритм подписи (в отличие от CryptSignMesssage тут нужен именно алгоритм подписи, а не хэша)
Код:
SigAlg.pszObjId = szOID_CP_GOST_R3411_R3410EL;

вместо
Код:
SigAlg.pszObjId = szOID_CP_GOST_R3411;

и заменил имя контейнера на свое.
Результат прилагаю.

Вложение(я):
test_0.req.txt (1kb) загружен 5 раз(а).

У Вас нет прав для просмотра или загрузки вложений. Попробуйте зарегистрироваться.
Техническую поддержку оказываем тут
Наша база знаний
thanks 1 пользователь поблагодарил Кирилл Соболев за этот пост.
manigu оставлено 02.09.2014(UTC)
Offline manigu  
#8 Оставлено : 2 сентября 2014 г. 12:56:34(UTC)
manigu

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

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

Сказал(а) «Спасибо»: 21 раз
Автор: Kirill Sobolev Перейти к цитате
У меня Ваш код отрабатывает нормально.
Отличия - вставил вызов
Код:
writeToFile(NULL, pbSignedEncodedCertReq, cbEncodedCertReqSize);

вместо
Код:
pSignedEncodedCertReqBlob = new char[(cbEncodedCertReqSize * 2) + 1];
,
алгоритм подписи (в отличие от CryptSignMesssage тут нужен именно алгоритм подписи, а не хэша)
Код:
SigAlg.pszObjId = szOID_CP_GOST_R3411_R3410EL;

вместо
Код:
SigAlg.pszObjId = szOID_CP_GOST_R3411;

и заменил имя контейнера на свое.
Результат прилагаю.



Спасибо Вам большое, всё получилось. Dancing
Offline manigu  
#9 Оставлено : 2 сентября 2014 г. 13:00:15(UTC)
manigu

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

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

Сказал(а) «Спасибо»: 21 раз
Вот только то что я указал в запросе нету, есть только email который определился в АРМ как Общее имя, все остальные поля пустые.

Код:

rgNameAttr[0].pszObjId = "2.5.4.3";
		rgNameAttr[0].dwValueType = CERT_RDN_PRINTABLE_STRING;
		rgNameAttr[0].Value.cbData = strlen(UserName_C);
		rgNameAttr[0].Value.pbData = (BYTE*)UserName_C;
		
		rgNameAttr[1].pszObjId = "2.5.4.6";
		rgNameAttr[1].dwValueType = CERT_RDN_PRINTABLE_STRING;
		rgNameAttr[1].Value.cbData = strlen("RU");
		rgNameAttr[1].Value.pbData = (BYTE*)"RU";

		rgNameAttr[2].pszObjId = "2.5.4.7";
		rgNameAttr[2].dwValueType = CERT_RDN_PRINTABLE_STRING;
		rgNameAttr[2].Value.cbData = strlen("Moscow");
		rgNameAttr[2].Value.pbData = (BYTE*)"Moscow";
		
		rgNameAttr[3].pszObjId = "2.5.4.8";
		rgNameAttr[3].dwValueType = CERT_RDN_PRINTABLE_STRING;
		rgNameAttr[3].Value.cbData = strlen("Russia");
		rgNameAttr[3].Value.pbData = (BYTE*)"Russia";

		rgNameAttr[4].pszObjId = "2.5.4.10";
		rgNameAttr[4].dwValueType = CERT_RDN_PRINTABLE_STRING;
		rgNameAttr[4].Value.cbData = strlen("Roga i Kopita");
		rgNameAttr[4].Value.pbData = (BYTE*)"Roga i Kopita";
		
		rgNameAttr[5].pszObjId = "1.2.840.113549.1.9.1";
		rgNameAttr[5].dwValueType = CERT_RDN_PRINTABLE_STRING;
		rgNameAttr[5].Value.cbData = strlen("email@test.com");
		rgNameAttr[5].Value.pbData = (BYTE*)"email@test.com";
Offline manigu  
#10 Оставлено : 2 сентября 2014 г. 16:34:58(UTC)
manigu

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

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

Сказал(а) «Спасибо»: 21 раз
Автор: manigu Перейти к цитате
Вот только то что я указал в запросе нету, есть только email который определился в АРМ как Общее имя, все остальные поля пустые.

Код:

rgNameAttr[0].pszObjId = "2.5.4.3";
		rgNameAttr[0].dwValueType = CERT_RDN_PRINTABLE_STRING;
		rgNameAttr[0].Value.cbData = strlen(UserName_C);
		rgNameAttr[0].Value.pbData = (BYTE*)UserName_C;
		
		rgNameAttr[1].pszObjId = "2.5.4.6";
		rgNameAttr[1].dwValueType = CERT_RDN_PRINTABLE_STRING;
		rgNameAttr[1].Value.cbData = strlen("RU");
		rgNameAttr[1].Value.pbData = (BYTE*)"RU";

		rgNameAttr[2].pszObjId = "2.5.4.7";
		rgNameAttr[2].dwValueType = CERT_RDN_PRINTABLE_STRING;
		rgNameAttr[2].Value.cbData = strlen("Moscow");
		rgNameAttr[2].Value.pbData = (BYTE*)"Moscow";
		
		rgNameAttr[3].pszObjId = "2.5.4.8";
		rgNameAttr[3].dwValueType = CERT_RDN_PRINTABLE_STRING;
		rgNameAttr[3].Value.cbData = strlen("Russia");
		rgNameAttr[3].Value.pbData = (BYTE*)"Russia";

		rgNameAttr[4].pszObjId = "2.5.4.10";
		rgNameAttr[4].dwValueType = CERT_RDN_PRINTABLE_STRING;
		rgNameAttr[4].Value.cbData = strlen("Roga i Kopita");
		rgNameAttr[4].Value.pbData = (BYTE*)"Roga i Kopita";
		
		rgNameAttr[5].pszObjId = "1.2.840.113549.1.9.1";
		rgNameAttr[5].dwValueType = CERT_RDN_PRINTABLE_STRING;
		rgNameAttr[5].Value.cbData = strlen("email@test.com");
		rgNameAttr[5].Value.pbData = (BYTE*)"email@test.com";


Разобрался, вдруг кому пригодится.

Код:

    CERT_RDN_ATTR *rgNameAttr = new CERT_RDN_ATTR[6];//DN_count];
		
		rgNameAttr[0].pszObjId = "2.5.4.3";
		rgNameAttr[0].dwValueType = CERT_RDN_PRINTABLE_STRING;
		rgNameAttr[0].Value.cbData = strlen("Name Test");
		rgNameAttr[0].Value.pbData = (BYTE*)"Name Test";
		
		rgNameAttr[1].pszObjId = "2.5.4.6";
		rgNameAttr[1].dwValueType = CERT_RDN_PRINTABLE_STRING;
		rgNameAttr[1].Value.cbData = strlen("RU");
		rgNameAttr[1].Value.pbData = (BYTE*)"RU";

		rgNameAttr[2].pszObjId = "2.5.4.7";
		rgNameAttr[2].dwValueType = CERT_RDN_PRINTABLE_STRING;
		rgNameAttr[2].Value.cbData = strlen("Moscow");
		rgNameAttr[2].Value.pbData = (BYTE*)"Moscow";
		
		rgNameAttr[3].pszObjId = "2.5.4.8";
		rgNameAttr[3].dwValueType = CERT_RDN_PRINTABLE_STRING;
		rgNameAttr[3].Value.cbData = strlen("Russia");
		rgNameAttr[3].Value.pbData = (BYTE*)"Russia";

		rgNameAttr[4].pszObjId = "2.5.4.10";
		rgNameAttr[4].dwValueType = CERT_RDN_PRINTABLE_STRING;
		rgNameAttr[4].Value.cbData = strlen("Roga i Kopita");
		rgNameAttr[4].Value.pbData = (BYTE*)"Roga i Kopita";
		
		rgNameAttr[5].pszObjId = "1.2.840.113549.1.9.1";
		rgNameAttr[5].dwValueType = CERT_RDN_PRINTABLE_STRING;
		rgNameAttr[5].Value.cbData = strlen("email@test.com");
		rgNameAttr[5].Value.pbData = (BYTE*)"email@test.com";

		CERT_RDN *rgRDN = new CERT_RDN[6];
		rgRDN[0] = { 1, &rgNameAttr[0] };
		rgRDN[1] = { 1, &rgNameAttr[1] };
		rgRDN[2] = { 1, &rgNameAttr[2] };
		rgRDN[3] = { 1, &rgNameAttr[3] };
		rgRDN[4] = { 1, &rgNameAttr[4] };
		rgRDN[5] = { 1, &rgNameAttr[5] };

		CERT_NAME_INFO Name = { 6, rgRDN };
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.