29.03.2007 8:03:13Создание запроса на сертификат CryptoAPI Ответов: 5
Волков
Создаю запрос на сертификат как в примере в MSDN:
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
{
MyHandleError("First call to CryptEncodeObject failed.\
\nA public/private key pair may not exit "
"in the container. \n");
}
if(!(pbNameEncoded = (BYTE*)malloc(cbNameEncoded)))
MyHandleError("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);
MyHandleError("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.
NULL, // Use the current user's logon name.
NULL, // Use the default provider.
75, // Need to both encrypt and sign.
CRYPT_NEWKEYSET)) // No flags needed.
{
printf("A cryptographic provider has been acquired. \n");
}
else
{
free(pbNameEncoded);
MyHandleError("CryptAcquireContext failed.");
}

//-------------------------------------------------------------------
if(CryptExportPublicKeyInfo(
hCryptProv, // Provider handle
AT_SIGNATURE, // 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);
MyHandleError("First call to CryptExportPublickKeyInfo failed.\
\nProbable cause: No key pair in the key container. \n");
}
программа выполняется но последняя функция возвращает ноль, в чем дело?
 
Ответы:
29.03.2007 9:29:50Kirill Sobolev
Возможно нет ключа подписи?
29.03.2007 10:00:20Волков
А откуда им взяться если я только генерирую запрос на них?
29.03.2007 10:34:31Kirill Sobolev
Вы создаете запрос на сертификат я так понял а не на ключи.
Сертификат - это заверенный центром сертификации Ваш ОК. Так что генерить ключевую пару надо перед созданием запроса, и запрос потом полученным секретным ключем подписать.
29.03.2007 10:39:27Волков
Т.е. нужно сначала создать контейнер сгенерировать пару ключей, поместить в созданный контейнер, и в запросе на сертификат отправлять сгенерированный открытый ключ?
29.03.2007 11:04:19Kirill Sobolev
Именно так.