2013-09-05 3 views
0

обрешетки сертификат и секретный ключ файл по Makecert.exe с командой нижеCryptImportKey возвращает «Плохую версию поставщика». Ошибка

Makecert.exe -n "CN = тест" -pe -ss моего -sr LocalMachine -sky биржевого -m 96 -a sha1 -len 2048 -r test.cer -sv test.pvk

и у меня есть test.pvk файлу

теперь я хочу использовать закрытый ключ в моей программе

CryptImportKey функция возвращает «Bad Version поставщика «. Ошибка

#include "stdafx.h" 
#include "windows.h" 
#include "tchar.h" 

#include <wincrypt.h> 
#include <cryptuiapi.h> 

#pragma comment (lib, "crypt32.lib") 
#pragma comment (lib, "cryptui.lib") 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    HANDLE hPrivateKeyFile; 

    HCRYPTPROV hCryptProv; 
    HCRYPTKEY hKey; 

    BYTE* pbPublicKey ; 
    BYTE* pbPrivateKey; 

    DWORD dwPublicKeyLen ; 
    DWORD dwPrivateKeyLen; 

    WCHAR* strFileName=L"test.pvk"; 

    // Open private key file  
    if ((hPrivateKeyFile = CreateFile(strFileName,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN,NULL)) == INVALID_HANDLE_VALUE) 
    {   
      printf(("CreateFile error 0x%x\n")); exit(0);  
    } 

    // Get file size  
    if ((dwPrivateKeyLen = GetFileSize(hPrivateKeyFile, NULL)) == INVALID_FILE_SIZE) 
    { 
      printf(("GetFileSize error 0x%x\n")); exit(0);    
    } 

    // Create a buffer for the private key 
    if (!(pbPrivateKey = (BYTE *)malloc(dwPrivateKeyLen))) 
    {   
      printf(("malloc error 0x%x\n")); exit(0);   
    } 

    // Read private key 
    if (!ReadFile(hPrivateKeyFile, pbPrivateKey, dwPrivateKeyLen, &dwPrivateKeyLen, NULL)) 
    {   
      printf(("ReadFile error 0x%x\n")); exit(0);   
    } 

    if (!CryptAcquireContext(&hCryptProv, NULL, NULL, PROV_RSA_FULL, 0)) 
    {   
      printf(("CryptAcquireContext error 0x%x\n")); exit(0);  
    } 

    // Import private key 
    if (!CryptImportKey(hCryptProv, pbPrivateKey, dwPrivateKeyLen, 0, CRYPT_EXPORTABLE, &hKey)) 
    {   
      printf(("CryptImportKey error 0x%x\n")); 
      DWORD lastError=GetLastError();//Bad Version of provider. 
      exit(0);    
    } 


    return 0; 
} 
+0

Подождите, пока вы попытаетесь импортировать * закрытый * ключевой файл без связанного ключа дешифрования (помните, что ваш секретный ключ зашифрован). – WhozCraig

+0

i didnt введите пароль для создания закрытого ключа – Naderi

ответ

0
  • В CryptAcquireContext, измените последний параметр на CRYPT_NEWKEYSET | CRYPT_VERIFYCONTEXT

  • Проверьте возвращаемое значение hCryptProv. Он должен быть не-szero. CryptAcquireContext может возвращать TRUE и в то же время устанавливать hCryptProv в ноль.

+0

i изменить параметр на CRYPT_NEWKEYSET | CRYPT_VERIFYCONTEXT и hCryptProv отличен от нуля, но у меня ошибка – Naderi

+0

Вместо использования поставщика по умолчанию попробуйте использовать один из поставщиков в wincrypt.h (около строки 512). У вас есть немало на выбор. – cup

+0

У меня еще есть ошибка – Naderi

 Смежные вопросы

  • Нет связанных вопросов^_^