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

Уведомление

Icon
Error

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

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

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

Сказал(а) «Спасибо»: 21 раз
Создаю запрос на сертификат, если в запросе есть кириллица, то АРМ выдает ошибку:

Код:

Номер: 	-2147217887
Источник: 	Microsoft Cursor Engine
Описание: 	Multiple-step operation generated errors. Check each status value.


В качестве GUI использую MFC. EditCommonName - CString.

Код:

CERT_RDN_ATTR *rgNameAttr = new CERT_RDN_ATTR[1];
CERT_RDN *rgRDN = new CERT_RDN[1];
//CN - общее имя
LPSTR CN = W2A(EditCommonName);
rgNameAttr[0].pszObjId = "2.5.4.3";
rgNameAttr[0].dwValueType = CERT_RDN_PRINTABLE_STRING;
rgNameAttr[0].Value.cbData = strlen(CN);
rgNameAttr[0].Value.pbData = (BYTE*)CN;

rgRDN[0].cRDNAttr = 1;
rgRDN[0].rgRDNAttr = &rgNameAttr[0];

CERT_NAME_INFO RDNs = { 1, rgRDN };


вот 2 файла запроса, с кириллицей и латиницей.

Отредактировано пользователем 8 сентября 2014 г. 12:24:58(UTC)  | Причина: Не указана

Вложение(я):
q_en.txt (1kb) загружен 6 раз(а).
q_ru.txt (1kb) загружен 4 раз(а).

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

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

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

Поблагодарили: 177 раз в 168 постах
Кириллицу нельзя закодировать в printable string.
Техническую поддержку оказываем тут
Наша база знаний
thanks 1 пользователь поблагодарил Кирилл Соболев за этот пост.
manigu оставлено 08.09.2014(UTC)
Offline manigu  
#3 Оставлено : 8 сентября 2014 г. 12:33:32(UTC)
manigu

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

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

Сказал(а) «Спасибо»: 21 раз
Автор: Kirill Sobolev Перейти к цитате
Кириллицу нельзя закодировать в printable string.


А не подскажите как тогда быть? Кодировать всё в base64?
Offline Kirill Sobolev  
#4 Оставлено : 8 сентября 2014 г. 13:50:32(UTC)
Кирилл Соболев

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

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

Поблагодарили: 177 раз в 168 постах
Кодируйте как рекомендует MS.
Вместо юникода лучше использовать UTF-8.
Техническую поддержку оказываем тут
Наша база знаний
thanks 1 пользователь поблагодарил Кирилл Соболев за этот пост.
manigu оставлено 08.09.2014(UTC)
Offline manigu  
#5 Оставлено : 8 сентября 2014 г. 17:24:52(UTC)
manigu

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

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

Сказал(а) «Спасибо»: 21 раз
Автор: Kirill Sobolev Перейти к цитате
Кодируйте как рекомендует MS.
Вместо юникода лучше использовать UTF-8.


Не могу разобраться, что именно кодировать CertStrToName()?

Вот моя функция для создания запроса на сертификат.

Код:

bool createRequest(char* path, CERT_NAME_INFO RDNs) {
		size_t i;

		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
			&RDNs,                // Address of CERT_NAME_INFO structure
			NULL,                 // pbEncoded
			&cbNameEncoded))      // pbEncoded size
		{
			printf("The first call to CryptEncodeObject succeeded. \n");
		}
		else {
			printf("The first call to CryptEncodeObject failed. \nA public/private key pair may not exit in the container. \n");
		}

		if (!(pbNameEncoded = (BYTE*)malloc(cbNameEncoded))) {
			printf("The pbNamencoded malloc operation failed. \n");
			return false;
		}

		if (CryptEncodeObject(
			MY_ENCODING_TYPE,    // Encoding type
			X509_NAME,           // Structure type
			&RDNs,               // Address of CERT_NAME_INFO structure
			pbNameEncoded,       // pbEncoded
			&cbNameEncoded))     // pbEncoded size
		{
			printf("The object is encoded. \n");
		}
		else {
			free(pbNameEncoded);
			printf("The second call to CryptEncodeObject failed. \n");
			return false;
		}

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

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

		if (hCryptProv == NULL) {
			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);
				printf("CryptAcquireContext failed. \n");
				return false;
			}
		}


		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);
			printf("The first call to CryptExportPublickKeyInfo failed. \nThe probable cause is that \nthere is no key pair in the key container. \n");
			return false;
		}

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

		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);
			printf("The second call to CryptExportPublicKeyInfo failed. \n");
			return false;
		}

		CertReqInfo.SubjectPublicKeyInfo = *pbPublicKeyInfo;

		memset(&Parameters, 0, sizeof(Parameters));
		SigAlg.pszObjId = szOID_CP_GOST_R3411_R3410EL;
		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);
			printf("First call to CryptSignandEncode failed. \n");
			return false;
		}

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

		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);
			printf("The second call to CryptSignAndEncode failed. \n");
			return false;
		}

		writeToFile(path, pbSignedEncodedCertReq, cbEncodedCertReqSize);

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

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

		return true;
	}


А вот так я заполняю RDN.

Код:

		int count = getCountTrue();
    int i = 0;
		CERT_RDN_ATTR *rgNameAttr = new CERT_RDN_ATTR[count];
		CERT_RDN *rgRDN = new CERT_RDN[count];

		if(testCommonName(true)) {
			LPSTR edit = W2A(EditCommonName);
			//CN - общее имя
			rgNameAttr[i].pszObjId = "2.5.4.3";
			rgNameAttr[i].dwValueType = CERT_RDN_PRINTABLE_STRING;
			rgNameAttr[i].Value.cbData = strlen(edit);
			rgNameAttr[i].Value.pbData = (BYTE*)edit;
						
			rgRDN[i].cRDNAttr = 1;
			rgRDN[i].rgRDNAttr = &rgNameAttr[i];
			i++;
		} else {
			return;
		}
		
		if (testT(true)) {
			LPSTR edit = W2A(EditT);
			//T - Должность
			rgNameAttr[i].pszObjId = "2.5.4.12";
			rgNameAttr[i].dwValueType = CERT_RDN_PRINTABLE_STRING;
			rgNameAttr[i].Value.cbData = strlen(edit);
			rgNameAttr[i].Value.pbData = (BYTE*)edit;

			rgRDN[i].cRDNAttr = 1;
			rgRDN[i].rgRDNAttr = &rgNameAttr[i];
			i++;
		}
		else {
			return;
		}

		if(testOrganizationalUnit(true)) {
			LPSTR edit = W2A(EditOrganizationalUnit);
			//OU - Подразделение
			rgNameAttr[i].pszObjId = "2.5.4.11";
			rgNameAttr[i].dwValueType = CERT_RDN_PRINTABLE_STRING;
			rgNameAttr[i].Value.cbData = strlen(edit);
			rgNameAttr[i].Value.pbData = (BYTE*)edit;
						
			rgRDN[i].cRDNAttr = 1;
			rgRDN[i].rgRDNAttr = &rgNameAttr[i];
			i++;
		} else {
			return;
		}

		if(testOrganization(true)) {
			LPSTR edit = W2A(EditOrganization);
			//O - Организация
			rgNameAttr[i].pszObjId = "2.5.4.10";
			rgNameAttr[i].dwValueType = CERT_RDN_PRINTABLE_STRING;
			rgNameAttr[i].Value.cbData = strlen(edit);
			rgNameAttr[i].Value.pbData = (BYTE*)edit;
						
			rgRDN[i].cRDNAttr = 1;
			rgRDN[i].rgRDNAttr = &rgNameAttr[i];
			i++;
		} else {
			return;
		}
		
		if(testLocality(true)) {
			LPSTR edit = W2A(EditLocality);
			//L - Населенный пункт
			rgNameAttr[i].pszObjId = "2.5.4.7";
			rgNameAttr[i].dwValueType = CERT_RDN_PRINTABLE_STRING;
			rgNameAttr[i].Value.cbData = strlen(edit);
			rgNameAttr[i].Value.pbData = (BYTE*)edit;
						
			rgRDN[i].cRDNAttr = 1;
			rgRDN[i].rgRDNAttr = &rgNameAttr[i];
			i++;
		} else {
			return;
		}
		
		if(testState(true)) {
			LPSTR edit = W2A(EditState);
			//S - Регион
			rgNameAttr[i].pszObjId = "2.5.4.8";
			rgNameAttr[i].dwValueType = CERT_RDN_PRINTABLE_STRING;
			rgNameAttr[i].Value.cbData = strlen(edit);
			rgNameAttr[i].Value.pbData = (BYTE*)edit;
						
			rgRDN[i].cRDNAttr = 1;
			rgRDN[i].rgRDNAttr = &rgNameAttr[i];
			i++;
		} else {
			return;
		}

		if (testAddress(true)) {
			LPSTR edit = W2A(EditAddress);
			//A - Адрес
			rgNameAttr[i].pszObjId = "2.5.4.9";
			rgNameAttr[i].dwValueType = CERT_RDN_PRINTABLE_STRING;
			rgNameAttr[i].Value.cbData = strlen(edit);
			rgNameAttr[i].Value.pbData = (BYTE*)edit;

			rgRDN[i].cRDNAttr = 1;
			rgRDN[i].rgRDNAttr = &rgNameAttr[i];
			i++;
		}
		else {
			return;
		}
		
		if(testEmail(true)) {
			LPSTR edit = W2A(EditEmail);
			//E - адрес электронной почты
			rgNameAttr[i].pszObjId = "1.2.840.113549.1.9.1";
			rgNameAttr[i].dwValueType = CERT_RDN_PRINTABLE_STRING;
			rgNameAttr[i].Value.cbData = strlen(edit);
			rgNameAttr[i].Value.pbData = (BYTE*)edit;
						
			rgRDN[i].cRDNAttr = 1;
			rgRDN[i].rgRDNAttr = &rgNameAttr[i];
			i++;
		} else {
			return;
		}
		
		if(testOGRN(true)) {
			LPSTR edit = W2A(EditOGRN);
			//OGRN - ОГРН
			rgNameAttr[i].pszObjId = "1.2.643.100.1";
			rgNameAttr[i].dwValueType = CERT_RDN_PRINTABLE_STRING;
			rgNameAttr[i].Value.cbData = strlen(edit);
			rgNameAttr[i].Value.pbData = (BYTE*)edit;
						
			rgRDN[i].cRDNAttr = 1;
			rgRDN[i].rgRDNAttr = &rgNameAttr[i];
			i++;
		} else {
			return;
		}
		
		if(testINN(true)) {
			LPSTR edit = W2A(EditINN);
			//INN - ИНН
			rgNameAttr[i].pszObjId = "1.2.643.3.131.1.1";
			rgNameAttr[i].dwValueType = CERT_RDN_PRINTABLE_STRING;
			rgNameAttr[i].Value.cbData = strlen(edit);
			rgNameAttr[i].Value.pbData = (BYTE*)edit;

			rgRDN[i].cRDNAttr = 1;
			rgRDN[i].rgRDNAttr = &rgNameAttr[i];
			i++;
		} else {
			return;
		}
		
		if(testOGRNIP(true)) {
			LPSTR edit = W2A(EditOGRNIP);
			//OGRNIP - ОГРНИП
			rgNameAttr[i].pszObjId = "1.2.643.100.5";
			rgNameAttr[i].dwValueType = CERT_RDN_PRINTABLE_STRING;
			rgNameAttr[i].Value.cbData = strlen(edit);
			rgNameAttr[i].Value.pbData = (BYTE*)edit;
						
			rgRDN[i].cRDNAttr = 1;
			rgRDN[i].rgRDNAttr = &rgNameAttr[i];
			i++;
		} else {
			return;
		}
		
		if(testSNILS(true)) {
			LPSTR edit = W2A(SNILS);
			//SNILS - СНИЛС
			rgNameAttr[i].pszObjId = "1.2.643.100.3";
			rgNameAttr[i].dwValueType = CERT_RDN_PRINTABLE_STRING;
			rgNameAttr[i].Value.cbData = strlen(edit);
			rgNameAttr[i].Value.pbData = (BYTE*)edit;
						
			rgRDN[i].cRDNAttr = 1;
			rgRDN[i].rgRDNAttr = &rgNameAttr[i];
			i++;
		} else {
			return;
		}

		//C - страна
		rgNameAttr[i].pszObjId = "2.5.4.6";
		rgNameAttr[i].dwValueType = CERT_RDN_PRINTABLE_STRING;
		rgNameAttr[i].Value.cbData = strlen("RU");
		rgNameAttr[i].Value.pbData = (BYTE*)"RU";
					
		rgRDN[i].cRDNAttr = 1;
		rgRDN[i].rgRDNAttr = &rgNameAttr[i];

		CERT_NAME_INFO RDNs = { count, rgRDN };
Offline Андрей Писарев  
#6 Оставлено : 8 сентября 2014 г. 18:27:47(UTC)
Андрей *

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

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

Сказал «Спасибо»: 621 раз
Поблагодарили: 2397 раз в 1886 постах
Код:
 rgNameAttr[i].dwValueType = CERT_RDN_PRINTABLE_STRING;
Техническую поддержку оказываем тут
Наша база знаний
thanks 1 пользователь поблагодарил Андрей * за этот пост.
manigu оставлено 09.09.2014(UTC)
Offline Kirill Sobolev  
#7 Оставлено : 9 сентября 2014 г. 9:25:11(UTC)
Кирилл Соболев

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

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

Поблагодарили: 177 раз в 168 постах
Цитата:
Не могу разобраться, что именно кодировать CertStrToName()?

У Вас везде жестко прописан CERT_RDN_PRINTABLE_STRING.
По ссылке же есть таблица, в которой для каждого компонента имени расписаны допустимые варианты кодировки.
Техническую поддержку оказываем тут
Наша база знаний
thanks 1 пользователь поблагодарил Кирилл Соболев за этот пост.
manigu оставлено 09.09.2014(UTC)
Offline manigu  
#8 Оставлено : 9 сентября 2014 г. 10:41:44(UTC)
manigu

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

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

Сказал(а) «Спасибо»: 21 раз
Автор: Kirill Sobolev Перейти к цитате
Цитата:
Не могу разобраться, что именно кодировать CertStrToName()?

У Вас везде жестко прописан CERT_RDN_PRINTABLE_STRING.
По ссылке же есть таблица, в которой для каждого компонента имени расписаны допустимые варианты кодировки.


Пробовал разные варианты, не выходит.

Заменил CERT_RDN_PRINTABLE_STRING на CERT_RDN_UTF8_STRING.

Код:

      LPSTR edit = W2A(EditCommonName);
			//CN - общее имя
			rgNameAttr[i].pszObjId = "2.5.4.3";
			rgNameAttr[i].dwValueType = CERT_RDN_UTF8_STRING;
			rgNameAttr[i].Value.cbData = strlen(edit);
			rgNameAttr[i].Value.pbData = (BYTE*)edit;
						
			rgRDN[i].cRDNAttr = 1;
			rgRDN[i].rgRDNAttr = &rgNameAttr[i];


Так же заменил в соответствии с таблицей все на CERT_RDN_T61_STRING и у EMAIL на CERT_RDN_IA5_STRING

Код:

      LPSTR edit = W2A(EditCommonName);
			//CN - общее имя
			rgNameAttr[i].pszObjId = "2.5.4.3";
			rgNameAttr[i].dwValueType = CERT_RDN_T61_STRING;
			rgNameAttr[i].Value.cbData = strlen(edit);
			rgNameAttr[i].Value.pbData = (BYTE*)edit;
						
			rgRDN[i].cRDNAttr = 1;
			rgRDN[i].rgRDNAttr = &rgNameAttr[i];


Использовал CertStrToName(), как с параметром CERT_NAME_STR_ENABLE_T61_UNICODE_FLAG, так и CERT_NAME_STR_ENABLE_UTF8_UNICODE_FLAG.

Код:

	bool MyEncrypt(LPCTSTR pszX500, BYTE *pbEncoded, DWORD *pcbEncoded) {
  	//CERT_NAME_STR_ENABLE_UTF8_UNICODE_FLAG
		if (CertStrToName(X509_ASN_ENCODING, pszX500, CERT_NAME_STR_ENABLE_T61_UNICODE_FLAG, NULL, pbEncoded, pcbEncoded, NULL)) {
			return true;
		} else {
			return false;
		}
	}


Код:

      LPSTR edit = W2A(EditCommonName);
			//CN - общее имя
			rgNameAttr[i].pszObjId = "2.5.4.3";
			rgNameAttr[i].dwValueType = CERT_RDN_T61_STRING;//CERT_RDN_UTF8_STRING
			rgNameAttr[i].Value.cbData = strlen(edit);
			rgNameAttr[i].Value.pbData = (BYTE*)edit;
			MR.MyEncrypt((LPCTSTR)edit, rgNameAttr[i].Value.pbData, &rgNameAttr[i].Value.cbData);
						
			rgRDN[i].cRDNAttr = 1;
			rgRDN[i].rgRDNAttr = &rgNameAttr[i];

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

Offline Kirill Sobolev  
#9 Оставлено : 9 сентября 2014 г. 14:25:03(UTC)
Кирилл Соболев

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

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

Поблагодарили: 177 раз в 168 постах
Цитата:
Заменил CERT_RDN_PRINTABLE_STRING на CERT_RDN_UTF8_STRING.

Помимо замены нужно еще и Value правильно закодировать.
Цитата:
Использовал CertStrToName(), как с параметром CERT_NAME_STR_ENABLE_T61_UNICODE_FLAG, так и CERT_NAME_STR_ENABLE_UTF8_UNICODE_FLAG.

CertStrToName служит для другой цели.
Допустим, у Вас есть готовая строка субъекта вида "CN=Иванов Иван, L=Москва, C=RU, E=iva@nov.com", которую Вы хотите закодировать в ASN.1.
Вот для этого как раз CertStrToName и предназначена.
Попробуйте начать с обратного - возьмите готовый PKCS#10 запрос, сделанный, например, в АРМ Администратора и распарсите его в своей программе.
Будет видно, каким образом заполняется структура CERT_NAME_INFO.

Техническую поддержку оказываем тут
Наша база знаний
Offline Евгений Пономаренко  
#10 Оставлено : 9 сентября 2014 г. 14:25:05(UTC)
Евгений Пономаренко

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

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

Сказал(а) «Спасибо»: 48 раз
Поблагодарили: 23 раз в 19 постах
Добавлю к этому, что кодировать элементы DN надо все же в bitmap string
Типа:
DWORD selectRDNAttrType(SHARED_rdnValue& item)
{
DWORD result=CERT_RDN_BMP_STRING;
if(item)
{
//// FSB directive #795
if(!strcmp(item->oid,"1.2.643.100.1") ||
!strcmp(item->oid,"1.2.643.100.3") ||
!strcmp(item->oid,"1.2.643.3.131.1.1") ||
!strcmp(item->oid,"1.2.643.100.5")) // INN,OGRN,OGRNIP,SNILS
result=CERT_RDN_NUMERIC_STRING;
else
if(!strcmp(item->oid,"1.2.840.113549.1.9.1")) // E
result=CERT_RDN_IA5_STRING;
else
if(!strcmp(item->oid,"2.5.4.6") ||
!strcmp(item->oid,"1.2.840.113549.1.9.2")) // C, UN
result=CERT_RDN_PRINTABLE_STRING;
else
result=CERT_RDN_BMP_STRING;
}

return result;
}
Иначе возможны проблемы с изготовленными по этому запросу сертификатами и Криптопро CSP/Linux
Об этом я писал здесь: https://www.cryptopro.ru...sts&t=7502#post48113
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
2 Страницы12>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.