2017-02-22 21 views
1

Я пытаюсь создать сертификат для тестирования в два этапа. Во-первых, я создаю самозаверяющий сертификат, который устанавливает мой собственный центр сертификации (CA). Во-вторых, я использую этот корневой сертификат для подписи сертификата тестового сервера, который будет помещен в хранилище личных сертификатов. Я открываю административную командную строку и введите следующее:Установите самозаверяющий сертификат в личный магазин из файла .cer с помощью C++

Шаг 1: MakeCert -pe -n "CN = TestCA" -b 01/01/2015 -e 01/01/2020 -ss мой -SR CurrentUser -a sha256 -sky подписи -len 2048 -r "TestCA.cer"

Шаг 2: MakeCert -pe -n "CN = локальный" -b 01/01/2015 -e 01/01/2020 -eku 1.3.6.1.5.5.7.3.1 -in «TestCA» -ий мой -ий текущий пользователь -ss my -sr currentuser -a sha256 -sky exchange -sp «Microsoft RSA SChannel Cryptographic Provider» -sy 12 -лень 2048 "Localhost.cer"

Следуя этим шагам, все работает нормально. После этого я пытаюсь установить эти сертификаты с помощью приложения C++. Кажется, все хорошо, когда я проверяю эти сертификаты в certmgr.msc, однако клиент с тех пор всегда не может подключиться к серверу. После удаления сертификата «localhost» из хранилища личных сертификатов, повторите шаг 2 с помощью MakeCert.exe. Клиент может успешно подключиться к серверу. Может быть, есть что-то важное, что мне не хватало. Если кто-нибудь это знает, пожалуйста, дайте мне несколько советов. Кстати, мой клиент и сервер работают на одном компьютере. Мои коды показаны ниже.

HCERTSTORE hMyCertStore = NULL; 
if(hMyCertStore = CertOpenStore(
    CERT_STORE_PROV_SYSTEM,   // The store provider type 
    0,        // The encoding type is 
            // not needed 
    NULL,       // Use the default HCRYPTPROV 
    CERT_SYSTEM_STORE_CURRENT_USER, // Set the store location in a 
            // registry location 
    L"MY"       // The store name as a Unicode 
            // string 
    )) 
{ 
    printf("The system store was created successfully.\n"); 
} 
else 
{ 
    printf("An error occurred during creation " 
     "of the system store!\n"); 
    exit(1); 
} 

CRYPTUI_WIZ_IMPORT_SRC_INFO importSrc; 

memset(&importSrc, 0, sizeof(CRYPTUI_WIZ_IMPORT_SRC_INFO)); 
importSrc.dwSize = sizeof(CRYPTUI_WIZ_IMPORT_SRC_INFO); 
importSrc.dwSubjectChoice = CRYPTUI_WIZ_IMPORT_SUBJECT_FILE; 
importSrc.pwszFileName = L"C:\\Temp\\MakeCert\\localhost.cer"; 
importSrc.pwszPassword = L""; 
importSrc.dwFlags = CRYPT_EXPORTABLE | CRYPT_USER_PROTECTED; 

if (CryptUIWizImport(CRYPTUI_WIZ_NO_UI, 
        NULL, 
        NULL, 
        &importSrc, 
        hMyCertStore) == 0) 
{ 
    printf("CryptUIWizImport error %d\n", GetLastError()); 
} 

Любая помощь была бы принята с благодарностью.

Климент

ответ

0

Я нашел разницу между MakeCert и моим приложением. После установки с помощью MakeCert я открыл вкладку Общие диалогового окна сертификата, после чего обнаружил, что есть строка «У вас есть закрытый ключ, соответствующий этому сертификату, но с использованием моего приложения в диалоговом окне нет строки. Я думаю, что я пропустил несколько шагов во время процедуры установки. Если кто-нибудь знает, пожалуйста, дайте мне несколько предложений.

спасибо.

Климент