Windows cryptlib: проблема с привязкой закрытого ключа к сертификату - PullRequest
0 голосов
/ 02 октября 2018

Я пытаюсь создать сертификат клиента для моего приложения (написано в cpp).Программа завершается при выполнении CertSetCertificateContextProperty .Это даже не выдает никакой ошибки.Я не могу отладить его, так как это Windows API.Любая помощь приветствуется.Ниже приведены шаги, которые я выполнил:

Шаг 1: Я генерирую пару ключей как:

if (!CryptGenKey(hCryptProv, AT_KEYEXCHANGE, CRYPT_EXPORTABLE, &hKey))
{
    _tprintf(_T("CryptGenKey error 0x%x\n"), GetLastError());
    return 1;
}

Шаг 2: Экспорт закрытого ключа в виде:

if (!CryptExportKey(hKey, NULL, PRIVATEKEYBLOB, 0, pbPrivateKey, &dwPrivateKeyLen))
{
    // Error
    _tprintf(_T("CryptExportKey error 0x%x\n"), GetLastError());
    return 1;
}

Шаг 3: Создание сертификата с парой ключей с использованием моего ЦС.Шаг 4: Добавление сертификата в магазин Cert.(Я могу проверить это, напечатав все сертификаты в моем магазине)

pctx = CertCreateCertificateContext(MY_ENCODING_TYPE,
    (BYTE*)pfx,
    GetFileSize(hfile, 0));
.....
if (CertAddCertificateContextToStore(hSystemStore, pctx, CERT_STORE_ADD_REPLACE_EXISTING, 0)) 
{
    cout << "In AddCertToStoreWrapper: Certificate Successfully Added to the Cert store " << endl;
}

Шаг 4: Связать сертификат с парой ключей, созданной как шаг 1.(Программа была убита на этом шаге.

void LinkKeytoCert()
{
    HCERTSTORE hCertStore = 0;
    HANDLE hfile = 0;
    HANDLE hsection = 0;
    void* pfx = NULL;
    PCCERT_CONTEXT pCertContext = NULL;

    //Open the SystemStore
    if (hCertStore = CertOpenSystemStore(NULL, L"MY")) // TODO: vs CertOpenStore
    {
        cout << "\nIn LinkKeytoCert: Succuessfully Opened the System Store" << endl;
    }
    else
    {
        cout << "\nIn LinkKeytoCert: Unable to open the System Store" << endl;
    }

    if (CertFindCertificateInStore(
        hCertStore,
        MY_ENCODING_TYPE,             // Use X509_ASN_ENCODING
        0,                            // No dwFlags needed 
        CERT_FIND_SUBJECT_STR,        // Find a certificate with a
                                      // subject that matches the 
                                      // string in the next parameter
        L"damodar1",                  // The Unicode string to be found
                                      // in a certificate's subject
        pCertContext))                        // NULL for the first call to the
                                      // function 
                                      // In all subsequent
                                      // calls, it is the last pointer
                                      // returned by the function
    {
        cout << "In LinkKeytoCert: Found the certificate" << endl;
        //=====================Linking the Cert and Key===================================== 

        wchar_t str1[] = L"AlejaCMa.EncryptDecrypt";
        /*
        const wchar_t *str2 = L"Hello ";
        LPWSTR lpstrMyass = str1;
        */

        CRYPT_KEY_PROV_INFO pData = { 0 };
        pData.pwszContainerName = str1;
        pData.dwProvType = PROV_RSA_FULL;
        pData.dwKeySpec = AT_KEYEXCHANGE;
        pData.dwFlags = CERT_SET_KEY_PROV_HANDLE_PROP_ID;
        pData.pwszProvName = nullptr;
        cout << "In LinkKeytoCert: Setting the link " << endl;
        if (CertSetCertificateContextProperty(pCertContext, CERT_KEY_PROV_INFO_PROP_ID, 0, &pData)) //Program exit at this step. It doesn't even throws any error. I can't debug it as this is a Windows API.
        {
            cout << "CertSetCertificateContextProperty successful" << endl;
        }
        else
        {
            MyHandleError(TEXT("CertSetCertificateContextProperty failed."));
        }
        cout << "Successfully linked the certificate" << endl;
    }
    else
    {
        cout << "In LinkKeytoCert: Couldn't find the certificate" << endl;
    }
    //--------------------------------------------------------------------
    // Free Memory and close the open store.
    if (pCertContext)
    {
        CertFreeCertificateContext(pCertContext);
    }

    CertCloseStore(hCertStore, 0);
}
...