| ||||
| ||||
Создаю запрос на сертификат как в примере в 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"); } программа выполняется но последняя функция возвращает ноль, в чем дело? | ||||
Ответы: | ||||
| ||||
Возможно нет ключа подписи? | ||||
| ||||
А откуда им взяться если я только генерирую запрос на них? | ||||
| ||||
Вы создаете запрос на сертификат я так понял а не на ключи. Сертификат - это заверенный центром сертификации Ваш ОК. Так что генерить ключевую пару надо перед созданием запроса, и запрос потом полученным секретным ключем подписать. | ||||
| ||||
Т.е. нужно сначала создать контейнер сгенерировать пару ключей, поместить в созданный контейнер, и в запросе на сертификат отправлять сгенерированный открытый ключ? | ||||
| ||||
Именно так. | ||||