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

Уведомление

Icon
Error

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

Статус: Участник

Группы: Участники
Зарегистрирован: 23.06.2009(UTC)
Сообщений: 12

Уважаемые коллеги, поделитесь пожалуйста примером установки дополнительных атрибутов сертификата (?? или его закрытого ключа) при создании запроса на сертификат.

Насколько я понимаю, схема следующая:
1. Заполняем структуру CERT_PRIVATE_KEY_VALIDITY.
2. Заполняем структуру CERT_KEY_ATTRIBUTES_INFO.
3. Заполняем структуру CERT_REQUEST_INFO.
4. Передаём последнюю в CryptSignAndEncodeCertificate().

Пожалуйста, интересуют подробности, если можно! (Особенно при заполнении CERT_KEY_ATTRIBUTES_INFO).
Offline Kirill Sobolev  
#2 Оставлено : 18 ноября 2009 г. 18:46:17(UTC)
Кирилл Соболев

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

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

Поблагодарили: 177 раз в 168 постах
Схема корректная. В MSDN про каждую из этих структур написано достаточно подробно, что именно интересует?
Техническую поддержку оказываем тут
Наша база знаний
Offline Mickle  
#3 Оставлено : 18 ноября 2009 г. 20:22:56(UTC)
Mickle

Статус: Участник

Группы: Участники
Зарегистрирован: 23.06.2009(UTC)
Сообщений: 12

Если есть возможность, подкорректируйте реализацию. Если, нет, пришлите свой пример.

Обращаю внимание. Весь прочий код - работает. Сертификаты создаются и подписываются. Проблема именно здесь.


Конкретизирую:

FILETIME ftBegin(...), ftEnd(...);

CERT_PRIVATE_KEY_VALIDITY CertPrivateKeyValitity;
CertPrivateKeyValitity.NotBefore = ftBegin;
CertPrivateKeyValitity.NotAfter = ftEnd;

BYTE bRepudiation(CERT_NON_REPUDIATION_KEY_USAGE);
CRYPT_BIT_BLOB CryptBitBlob;
CryptBitBlob.cbData = 1;
CryptBitBlob.pbData = &bRepudiation;

Далее возможно необходимо выполнить CryptEncodeObject() для CryptBitBlob.pbData??

(Далее мы будем заполнять структуру CERT_KEY_ATTRIBUTES_INFO. Действия следующие)

Создадим хэш ранее инициализированной структуры CERT_PUBLIC_KEY_INFO:

HCRYPTHASH hHash(NULL);
bReturn = CryptCreateHash(hCryptProv, CALG_SHA1, 0, 0, &hHash);

bReturn = CryptHashData(hHash, (BYTE*)pbPublicKeyInfo, cbPublicKeyInfo, 0);

DWORD dwHashSize(0);
DWORD dwDataLen(4);
bReturn = CryptGetHashParam(hHash, HP_HASHSIZE, (BYTE*)&dwHashSize, &dwDataLen, 0);

BYTE* pbHashVal = new BYTE[dwHashSize];
bReturn = CryptGetHashParam(hHash, HP_HASHVAL, pbHashVal, &dwHashSize, 0);


Заполним CRYPT_DATA_BLOB
CRYPT_DATA_BLOB CryptDataBlob;
CryptDataBlob.cbData = dwHashSize;
CryptDataBlob.pbData = pbHashVal;

И, наконец, заполним CERT_KEY_ATTRIBUTES_INFO
CERT_KEY_ATTRIBUTES_INFO CertKeyAttrInfo;
CertKeyAttrInfo.pPrivateKeyUsagePeriod = &CertPrivateKeyValitity;
CertKeyAttrInfo.IntendedKeyUsage = CryptBitBlob;
CertKeyAttrInfo.KeyId = CryptDataBlob; (Обратите внимание!!!)


Далее возможно необходимо выполнить CryptEncodeObject() для CertKeyAttrInfo??


Заполняем CRYPTOAPI_BLOB
CRYPT_ATTR_BLOB CryptAttrBlob;
CryptAttrBlob.cbData = cbKeyAttrEncoded;
CryptAttrBlob.pbData = pbKeyAttrEncoded;

Заполняем CRYPT_ATTRIBUTE
CRYPT_ATTRIBUTE CryptAttribute;
CryptAttribute.pszObjId = szOID_KEY_ATTRIBUTES;
CryptAttribute.cValue = 1;
CryptAttribute.rgValue = &CryptAttrBlob;

Заполняем CERT_REQUEST_INFO
CERT_REQUEST_INFO CertReqInfo;
CertReqInfo.Subject = SubjNameBlob;
CertReqInfo.cAttribute = 1;
CertReqInfo.rgAttribute = &CryptAttribute;
CertReqInfo.dwVersion = CERT_REQUEST_V1;
CertReqInfo.SubjectPublicKeyInfo = *pbPublicKeyInfo;


И уже CERT_REQUEST_INFO будет передана в CryptSignAndEncodeCertificate().
Offline Kirill Sobolev  
#4 Оставлено : 19 ноября 2009 г. 14:46:51(UTC)
Кирилл Соболев

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

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

Поблагодарили: 177 раз в 168 постах
Цитата:
Далее возможно необходимо выполнить CryptEncodeObject() для CryptBitBlob.pbData??

Нет.
Цитата:
Создадим хэш ранее инициализированной структуры CERT_PUBLIC_KEY_INFO:

Для этого есть специальная функция - CryptHashPublicKeyInfo.
Цитата:
Далее возможно необходимо выполнить CryptEncodeObject() для CertKeyAttrInfo??

Да.
Цитата:
Заполняем CRYPT_ATTRIBUTE

CERT_KEY_ATTRIBUTES_INFO - это не атрибут запроса, а расширение сертификата - соответственно и должна попадать в расширения (массив CERT_EXTENSIONS), которые уже потом кодируются в один атрибут.
Техническую поддержку оказываем тут
Наша база знаний
Offline Mickle  
#5 Оставлено : 19 ноября 2009 г. 19:15:53(UTC)
Mickle

Статус: Участник

Группы: Участники
Зарегистрирован: 23.06.2009(UTC)
Сообщений: 12

Результат, к сожалению, пока отрицательный.

Симптомы таковы: запрос на сертификат успешно создаётся, CA возвращает сертификат.
НО! дополнительные атрибуты ключа, такие как CERT_NON_REPUDIATION_KEY_USAGE или CERT_DIGITAL_SIGNATURE_KEY_USAGE не устанавливаются. Аналогично и временные рамки валидности сертификата остаются "по-умолчанию" (??) - 1 год с даты выписки.

То есть получаемый сертификат одинаков - делаем мы эти "танцы с бубном" или нет) При этом, данные передаваемые в SERT_NAME_ARRAY (common name, locality и т.п.) благополучно устанавливаются, куда им и положено.

Ещё раз подчеркну. Рассматриваем процесс создания ЗАПРОСА на сертификат. Для взаимодействия с удалённым CA используем COM-компонент CertRequest.

???? М.б. на CA используется особый шаблон для этого интерфейса ????

Текущий код таков:

// fill CERT_PRIVATE_KEY_VALIDITY
FILETIME ftBegin(...), ftEnd(...);
CERT_PRIVATE_KEY_VALIDITY CertPrivateKeyValitity;
CertPrivateKeyValitity.NotBefore = ftBegin;
CertPrivateKeyValitity.NotAfter = ftEnd;

// fill CRYPT_BIT_BLOB
BYTE bRepudiation[2] = {(CERT_NON_REPUDIATION_KEY_USAGE | CERT_DIGITAL_SIGNATURE_KEY_USAGE | CERT_DATA_ENCIPHERMENT_KEY_USAGE), 0};

CRYPT_BIT_BLOB CryptBitBlob;
CryptBitBlob.cbData = 2;
CryptBitBlob.pbData = bRepudiation;
CryptBitBlob.cUnusedBits = 0;

DWORD dwHashSize(0);
bReturn = CryptHashPublicKeyInfo(hCryptProv, CALG_SHA1, 0, PKCS_7_ASN_ENCODING, pbPublicKeyInfo, NULL, &dwHashSize);

BYTE* pbHashVal = new BYTE[dwHashSize];
bReturn = CryptHashPublicKeyInfo(hCryptProv, CALG_SHA1, 0, PKCS_7_ASN_ENCODING, pbPublicKeyInfo, pbHashVal, &dwHashSize);


// fill CRYPT_DATA_BLOB
CRYPT_DATA_BLOB CryptDataBlob;
CryptDataBlob.cbData = dwHashSize;
CryptDataBlob.pbData = pbHashVal;

// fill CERT_KEY_ATTRIBUTES_INFO
CERT_KEY_ATTRIBUTES_INFO CertKeyAttrInfo;
CertKeyAttrInfo.pPrivateKeyUsagePeriod = &CertPrivateKeyValitity;
CertKeyAttrInfo.IntendedKeyUsage = CryptBitBlob;
CertKeyAttrInfo.KeyId = CryptDataBlob;


DWORD cbKeyAttrEncoded(0);

bReturn = CryptEncodeObject(
PKCS_7_ASN_ENCODING // Encoding type
, X509_KEY_ATTRIBUTES // Structure type
, &CertKeyAttrInfo // Address of CERT_KEY_ATTRIBUTES_INFO structure
, NULL // pbEncoded
, &cbKeyAttrEncoded); // pbEncoded size


//-------------------------------------------------------------------
// Allocate memory for the encoded struct.
BYTE* pbKeyAttrEncoded(NULL);

pbKeyAttrEncoded = (BYTE*)malloc(cbKeyAttrEncoded);

//-------------------------------------------------------------------
// Call CryptEncodeObject to do the actual encoding of the struct.

bReturn = CryptEncodeObject(
PKCS_7_ASN_ENCODING // Encoding type
, X509_KEY_ATTRIBUTES // Structure type
, &CertKeyAttrInfo // Address of CERT_KEY_ATTRIBUTES_INFO structure
, pbKeyAttrEncoded // pbEncoded
, &cbKeyAttrEncoded); // pbEncoded size



// fill CRYPTOAPI_BLOB
CRYPT_OBJID_BLOB CryptObjidBlob;
CryptObjidBlob.cbData = cbKeyAttrEncoded;
CryptObjidBlob.pbData = pbKeyAttrEncoded;


CERT_EXTENSION CertExtension[] =
{
{
szOID_KEY_ATTRIBUTES,
TRUE,
CryptObjidBlob
}
};


CERT_EXTENSIONS CertExtensions;
CertExtensions.cExtension = 1;
CertExtensions.rgExtension = &CertExtension[0];


DWORD cbCertExtensionsEncoded(0);

bReturn = CryptEncodeObject(
PKCS_7_ASN_ENCODING // Encoding type
, X509_EXTENSIONS // Structure type
, &CertExtensions // Address of CERT_EXTENSIONS structure
, NULL // pbEncoded
, &cbCertExtensionsEncoded); // pbEncoded size

//-------------------------------------------------------------------
// Allocate memory for the encoded struct.
BYTE* pbCertExtensionsEncoded(NULL);

pbCertExtensionsEncoded = (BYTE*)malloc(cbCertExtensionsEncoded);

//-------------------------------------------------------------------
// Call CryptEncodeObject to do the actual encoding of the struct.

bReturn = CryptEncodeObject(
PKCS_7_ASN_ENCODING // Encoding type
, X509_EXTENSIONS // Structure type
, &CertExtensions // Address of CERT_EXTENSIONS structure
, pbCertExtensionsEncoded // pbEncoded
, &cbCertExtensionsEncoded); // pbEncoded size
////////////////////////////////////////////////////////////////////////

// fill CRYPTOAPI_BLOB
CRYPT_ATTR_BLOB AttributesBlobArr[] =
{
{
cbCertExtensionsEncoded,
pbCertExtensionsEncoded
}
};

// fill CRYPT_ATTRIBUTE
CRYPT_ATTRIBUTE CryptAttribute;
CryptAttribute.pszObjId = szOID_CERT_EXTENSIONS;
CryptAttribute.cValue = 1;
CryptAttribute.rgValue = AttributesBlobArr;


// fill CERT_REQUEST_INFO
CERT_REQUEST_INFO CertReqInfo;
CertReqInfo.Subject = SubjNameBlob;
CertReqInfo.cAttribute = 1;
CertReqInfo.rgAttribute = &CryptAttribute;
CertReqInfo.dwVersion = CERT_REQUEST_V1;
CertReqInfo.SubjectPublicKeyInfo = *pbPublicKeyInfo;


Далее вызывается CryptSignAndEncodeCertificate()
Offline Kirill Sobolev  
#6 Оставлено : 19 ноября 2009 г. 19:29:08(UTC)
Кирилл Соболев

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

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

Поблагодарили: 177 раз в 168 постах
Какой СА? В запрос это расширение попадает (можно глянуть с помощью certutil.exe)? В выпущенном сертификате оно есть?
Техническую поддержку оказываем тут
Наша база знаний
Offline Mickle  
#7 Оставлено : 19 ноября 2009 г. 21:20:05(UTC)
Mickle

Статус: Участник

Группы: Участники
Зарегистрирован: 23.06.2009(UTC)
Сообщений: 12

Вот дампы запроса и сертификата, соответственно.
В запросе расширения есть. В сертификате - нет.


certutil.exe C:\Kbad.der
402.203.0: 0x80070057 (WIN32: 87): ..CertCli Version
PKCS10 Certificate Request:
Version: 1
Subject:
L=, + O=Name1 + S=Name2 + CN=Name3

Public Key Algorithm:
Algorithm ObjectId: 1.2.840.113549.1.1.1 RSA
Algorithm Parameters:
05 00
Public Key Length: 1024 bits
Public Key: UnusedBits = 0
0000 30 81 89 02 81 81 00 a8 5a 75 61 98 8e b8 c5 d9
0010 5a 9a 2a 92 c8 c9 3d dc 70 83 4d d0 5d 3f a0 77
0020 65 9a 5c 8d 3f e5 74 0f fb 0f e6 f4 ee 77 5e d2
0030 2e 39 76 00 e7 ec 4c 05 9d 1e d3 5c f6 59 7d a2
0040 77 9c f5 6b 5b 54 f5 49 18 5c 54 91 cd 46 c3 4b
0050 ee be 16 40 26 70 a1 0d 14 73 01 eb 9c 65 e0 83
0060 69 fc c5 b1 02 b5 c3 d7 cb 53 44 98 cb 56 6f a3
0070 de 4c 6a 51 f5 c0 c8 31 d5 11 39 52 42 97 57 c2
0080 42 aa 78 12 e6 5b 85 02 03 01 00 01
Request Attributes: 1
1 attributes: /// !!!! ВОТ НУЖНЫЕ РАСШИРЕНИЯ. Где же они в сертификате???

Attribute[0]: 1.3.6.1.4.1.311.2.1.14 (Расширения сертификатов)
Value[0][0]:
Unknown Attribute type
Certificate Extensions: 1
2.5.29.2: Flags = 1(Critical), Length = 40
Атрибуты ключа
Идентификатор ключа=94 fe fb 72 bb 85 13 78 8e f8 9d 5c e5 8e 0c 34 43 2
0 86 f1
Использование ключа=Цифровая подпись, Неотрекаемость, Шифрование данных
(d0)

Не ранее=19 ноября 2010 г. 20:56:31
Не позднее=19 ноября 2012 г. 20:56:31

Signature Algorithm:
Algorithm ObjectId: 1.3.14.3.2.29 sha1RSA
Algorithm Parameters:
05 00
Signature: UnusedBits=0
0000 78 8a a1 93 0c 38 9b 21 5e 7f 5e bb 57 b3 1c ab
0010 13 57 13 94 85 b6 7b cc c0 ff c1 ab 1a b1 10 70
0020 b2 77 dc 2a 43 08 a7 cd 76 e9 23 78 5e 43 e5 68
0030 f7 22 a5 11 0e e4 92 12 f8 2d 32 62 6f b5 30 2c
0040 84 fd 93 93 c9 f7 f3 0f 3c ce 9f ea d0 bb a1 74
0050 0d 94 60 2f 42 a8 c0 15 a7 17 b0 0d ca 9c 41 cc
0060 fd d1 37 b5 3f 62 41 9a cf e5 95 3c f2 3a 14 c4
0070 ca 67 d6 47 5d 44 ee 1d ab ef ea 1e 25 a2 6b 6e
Signature matches Public Key
Key Id Hash(sha1): 94 fe fb 72 bb 85 13 78 8e f8 9d 5c e5 8e 0c 34 43 20 86 f1
CertUtil: -dump command completed successfully.

certutil.exe C:\Kbad.cer
402.203.0: 0x80070057 (WIN32: 87): ..CertCli Version
X509 Certificate:
Version: 3
Serial Number: 1fff4d0e00000000011e
Signature Algorithm:
Algorithm ObjectId: 1.2.840.113549.1.1.5 sha1RSA
Algorithm Parameters:
05 00
Issuer:
CN=NameX
DC=NameY
DC=NameZ
DC=NameW

NotBefore: 19.11.2009 17:47
NotAfter: 19.11.2010 17:57

Subject:
CN=Name1
O=Name2
L=,
S=Name3

Public Key Algorithm:
Algorithm ObjectId: 1.2.840.113549.1.1.1 RSA
Algorithm Parameters:
05 00
Public Key Length: 1024 bits
Public Key: UnusedBits = 0
0000 30 81 89 02 81 81 00 a8 5a 75 61 98 8e b8 c5 d9
0010 5a 9a 2a 92 c8 c9 3d dc 70 83 4d d0 5d 3f a0 77
0020 65 9a 5c 8d 3f e5 74 0f fb 0f e6 f4 ee 77 5e d2
0030 2e 39 76 00 e7 ec 4c 05 9d 1e d3 5c f6 59 7d a2
0040 77 9c f5 6b 5b 54 f5 49 18 5c 54 91 cd 46 c3 4b
0050 ee be 16 40 26 70 a1 0d 14 73 01 eb 9c 65 e0 83
0060 69 fc c5 b1 02 b5 c3 d7 cb 53 44 98 cb 56 6f a3
0070 de 4c 6a 51 f5 c0 c8 31 d5 11 39 52 42 97 57 c2
0080 42 aa 78 12 e6 5b 85 02 03 01 00 01
Certificate Extensions: 4
2.5.29.14: Flags = 0, Length = 16
Идентификатор ключа субъекта
94 fe fb 72 bb 85 13 78 8e f8 9d 5c e5 8e 0c 34 43 20 86 f1

2.5.29.35: Flags = 0, Length = 18
Идентификатор ключа центра сертификатов
Идентификатор ключа=9d 86 c9 64 78 99 46 f8 a1 5a 31 20 cc 50 95 6f d9 3
6 67 89

2.5.29.31: Flags = 0, Length = 96
Точки распространения списков отзыва (CRL)
[1]Точка распределения списка отзыва (CRL)
Имя точки распространения:
Полное имя:
URL=http://
URL=file://

1.3.6.1.5.5.7.1.1: Flags = 0, Length = e1
Доступ к информации о центрах сертификации
[1]Доступ к сведениям центра сертификации
Метод доступа=Поставщик центра сертификации (1.3.6.1.5.5.7.48.2)
Дополнительное имя:
URL=http:
[2]Доступ к сведениям центра сертификации
Метод доступа=Поставщик центра сертификации (1.3.6.1.5.5.7.48.2)
Дополнительное имя:
URL=file:

Signature Algorithm:
Algorithm ObjectId: 1.2.840.113549.1.1.5 sha1RSA
Algorithm Parameters:
05 00
Signature: UnusedBits=0
0000 14 5d 69 90 dd 66 2a 0c 8b 2b df 52 5b c8 7b 6c
0010 d6 e1 3d 0e c4 0b de 87 41 99 f8 51 78 9a 10 a9
0020 82 db ca 2c 45 07 4a b1 40 fc 55 ba 32 b6 23 b0
0030 1e 94 95 59 50 5a ca 7a c9 b4 36 18 61 47 a0 72
0040 e8 3f 7e 69 f2 b2 af 20 ee f0 dc 92 bf 63 54 de
0050 80 fd d5 d0 8e 51 ed 8f ca 45 19 17 f2 67 92 79
0060 4b 67 8f 9d d0 2d 1f ce 52 98 83 35 7a 06 c3 8e
0070 cc f7 0e 21 e1 b2 98 7f 89 ca a8 70 03 ab a1 97
0080 6f d1 08 bc 2f 4e fe 59 94 5e a9 67 2d 06 7a 65
0090 77 4d 4a 4b 8c 0d 00 27 07 a0 9f 8f 48 e4 98 58
00a0 0e f6 e9 05 3b 81 6b b2 70 3a 65 5a 67 28 79 c0
00b0 e7 aa f0 2e dd 72 89 f1 5d 9c c6 7e 15 5c b9 7c
00c0 9f cf ca 80 00 05 d7 45 8d 1c fa 60 ab 80 6f 63
00d0 de 67 f5 fa b3 fe db 14 ed 82 3d 3a 8a 00 27 90
00e0 9b 5c 3a c3 5d 24 25 6e d4 cd 8a c0 61 73 78 ad
00f0 fc 80 93 c6 ed 1e e6 7e af 38 24 b7 9a c2 34 a1
Non-root Certificate
Key Id Hash(sha1): 94 fe fb 72 bb 85 13 78 8e f8 9d 5c e5 8e 0c 34 43 20 86 f1
Cert Hash(md5): b9 8d 4a 14 fd a4 a4 f4 83 b6 41 ae 7e f3 b9 c5
Cert Hash(sha1): f3 b1 f4 57 34 98 e8 19 73 60 8f 9d a0 aa a0 e6 c6 5d 72 9f
CertUtil: -dump command completed successfully.
Offline Mickle  
#8 Оставлено : 19 ноября 2009 г. 21:23:17(UTC)
Mickle

Статус: Участник

Группы: Участники
Зарегистрирован: 23.06.2009(UTC)
Сообщений: 12

СА вот такой:
Certification Authority
Microsoft Corporation
Version: 5.2.3
Offline Kirill Sobolev  
#9 Оставлено : 20 ноября 2009 г. 15:44:57(UTC)
Кирилл Соболев

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

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

Поблагодарили: 177 раз в 168 постах
Скорее всего, это расширение не разрешено для перекладывания.
http://technet.microsoft...ary/cc740063(WS.10).aspx
Техническую поддержку оказываем тут
Наша база знаний
Offline Mickle  
#10 Оставлено : 20 ноября 2009 г. 19:53:45(UTC)
Mickle

Статус: Участник

Группы: Участники
Зарегистрирован: 23.06.2009(UTC)
Сообщений: 12

Выдержка из статьи:

"
Enterprise CA устанавливают интервал действия сертификата на основе шаблонов Active Directory. Stand-alone CA принудительно устанавливают период действия выпущенных сертификатов на основе следующих значений из реестра…
"

Итак, выставление времени действия сертификата на основе данных запроса в CA от Microsoft не предусмотрено???

А что же тогда наши "упражнения" с CryptoAPI??

Из опыта работы с Enterprise (root) и Stand-alone CAs: для Stand-alone изменение шаблонов не предусмотрено.

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