Запись закрытого ключа в токен

#winapi #pkcs#11 #cryptoapi

#winapi #pkcs#11 #cryptoapi

Вопрос:

я использую PKCS # 11 для эмуляции токена, у меня есть сертификат в хранилище сертификатов Windows с надписью «У вас есть закрытый ключ, соответствующий этому сертификату». я пытаюсь найти функцию WinAPI, которая может считывать закрытый ключ сертификата (который находится либо в хранилище сертификатов, либо на жестком диске в формате pfx). Как я могу это сделать? Моя функция

 static void ImportPrivateKey(const char* fileName, const char* password)
{
    HCERTSTORE  hSystemStore;

    //Open the certificate store to be searched
    if(hSystemStore = CertOpenStore(
      CERT_STORE_PROV_SYSTEM,
      0,
      NULL,
      CERT_SYSTEM_STORE_CURRENT_USER,
      L"MY"))
        printf("Opened the MY system store. n");
    else
        printf( "Could not open the MY system store.n");

    PCCERT_CONTEXT  pDesiredCert = NULL;
    LPWSTR lpszCertSubject = L"7172gka"; // !!!!  Name of certificate to search 

    // Search certificate
    if(pDesiredCert=CertFindCertificateInStore(
      hSystemStore,
      MY_ENCODING_TYPE,
      0,
      CERT_FIND_SUBJECT_STR,
      lpszCertSubject ,
      pDesiredCert))
    {
        printf("The desired certificate was found. n");
    }
    else
    {
        printf("Could not find the desired certificate.n");
    }

    DWORD dwSize = 0;
    CRYPT_KEY_PROV_INFO* pKeyInfo = NULL;

    if(!(CertGetCertificateContextProperty( 
      pDesiredCert, 
      CERT_KEY_PROV_INFO_PROP_ID, 
      NULL, 
      amp;dwSize))) 
    { 
        printf("Error getting key property.n"); 
    }

    if(pKeyInfo) 
        free(pKeyInfo);

    pKeyInfo = (CRYPT_KEY_PROV_INFO*)malloc(dwSize);

    if(!pKeyInfo) 
    { 
        printf("Error allocating memory for pKeyInfo.n"); 
    }

    if(!(CertGetCertificateContextProperty( 
      pDesiredCert, 
      CERT_KEY_PROV_INFO_PROP_ID, 
      pKeyInfo, 
      amp;dwSize)))
    {
        printf("The second call to the function failedn");
    }

    printf("%sn", pKeyInfo->pwszProvName);
    if(pKeyInfo->dwKeySpec == AT_SIGNATURE)
        printf("Ok!n");
}
 

Комментарии:

1. вам нужно позвонить CertGetCertificateContextProperty с CERT_KEY_PROV_INFO_PROP_ID для получения информации о поставщике, а затем экспортировать закрытый ключ из контейнера поставщика

2. @RbMm как я могу экспортировать? я обновляю функцию

3. Не могли бы вы поделиться своим вариантом использования записи закрытого ключа в токен?