Статус: Активный участник
Группы: Участники
Зарегистрирован: 29.03.2011(UTC) Сообщений: 163  Откуда: Москва Сказал «Спасибо»: 8 раз Поблагодарили: 3 раз в 3 постах
|
Добрый день Прошу коллег поделиться знаниями по созданию запроса на изготовление сертификата. Запрос должен быть самоподписанным, а также подписанным руководителем подразделения. Поиском по форуму, а также изучая MSDN, восстановил примерно следующий алгоритм создания запроса: 1. Создаем PCERT_NAME_BLOB, куда складываем параметры для сертификата. PCERT_NAME_INFO в нем кодируем при помощи CryptEncodeObject. 2. Генерируем ключевую пару: Код:
prov = CryptAcquireContext("Test", NULL, PROV_GOST_2001_DH, CRYPT_NEWKEYSET)
key = CryptGenKey(prov, AT_SIGNATURE, 0)
3. Каким-то образом засовываем в запрос информацию об открытом ключе. В MSDN это сделано странным образом (вырезал лишнее для удобства): Код:
CryptAcquireContext(
&hCryptProv, // Address for handle to be returned.
NULL, // Use the current user's logon name.
NULL, // Use the default provider.
PROV_RSA_FULL, // Need to both encrypt and sign.
NULL); // No flags needed.
CryptExportPublicKeyInfo(
hCryptProv, // Provider handle
AT_SIGNATURE, // Key spec
MY_ENCODING_TYPE, // Encoding type
pbPublicKeyInfo, // pbPublicKeyInfo
&cbPublicKeyInfo) // Size of PublicKeyInfo
CertReqInfo.SubjectPublicKeyInfo = *pbPublicKeyInfo;
Я предполагаю, что открытый ключ надо добывать из вновь созданного keyset-а, при помощи CryptExportPublicKeyInfo, передав в нее хэндл сгенерированного ключа. После этого полученное CERT_PUBLIC_KEY_INFO положить в CertReqInfo.SubjectPublicKeyInfo. 4. Далее вызываем CryptSignAndEncodeCertificate: Код:
CryptSignAndEncodeCertificate(
hCryptProv, // хэндл провайдера, полученный для создания ключевой пары
AT_KEYEXCHANGE, // Key spec
MY_ENCODING_TYPE, // Encoding type
X509_CERT_REQUEST_TO_BE_SIGNED, // Structure type
&CertReqInfo, // наш сформированный запрос на сертификат
&SigAlg, // CALG_GR3410?
NULL, // Not used
pbSignedEncodedCertReq, // pbSignedEncodedCertReq
&cbEncodedCertReqSize)) // Size of certificate
В результате получаем в pbSignedEncodedCertReq - содержимое запроса, которое сохраняем в файл. А теперь вопросы: 1. Достаточно ли этих операций, чтобы получить самоподписанный запрос? Или надо генерировать самоподписанный сертификат и каким-то образом им подписывать полученный запрос? 2. Как добавить к этому запросу еще подпись руководителя?
|