Импорт PEM или DER сертификатов

Тема в разделе "WASM.CRYPTO", создана пользователем Sidorma, 20 янв 2011.

  1. Sidorma

    Sidorma New Member

    Публикаций:
    0
    Регистрация:
    9 дек 2010
    Сообщения:
    35
    Здравствуйте.

    Необходимо программными средствами (c/c++) установить сертификат в формате PEM или DER в доверенные корневые на локальной машине.
    Эта задача очень просто решается известной утилитой CertMgr.exe следующим образом:
    Код (Text):
    1. CertMgr.exe -add -all cacert.pem -s "Root" -r localMachine
    Подскажите, пожалуйста пути решения с помощью Cypto API или еще как-нибудь.
    Очень срочно надо!

    Спасибо.
     
  2. Sidorma

    Sidorma New Member

    Публикаций:
    0
    Регистрация:
    9 дек 2010
    Сообщения:
    35
    Сделал для PFX сертификатов. Вот код:
    Код (Text):
    1. #include <stdio.h>
    2. #include <windows.h>
    3. #include <wincrypt.h>
    4. #pragma comment(lib, "crypt32.lib")
    5.  
    6. void certImport(wchar_t *filename, wchar_t *password)
    7. {
    8.     HANDLE hfile = INVALID_HANDLE_VALUE;
    9.     HANDLE hsection = 0;
    10.     void* pfx = 0;
    11.     HCERTSTORE pfxStore = 0;
    12.     HCERTSTORE rootStore = 0;
    13.  
    14.     hfile = CreateFile(filename, FILE_READ_DATA, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0);
    15.     if (INVALID_HANDLE_VALUE == hfile) wprintf(L"CreateFile failed !\n");
    16.  
    17.     hsection = CreateFileMapping(hfile, 0, PAGE_READONLY, 0, 0, 0);
    18.     if (!hsection) {
    19.         wprintf(L"CreateFileMapping failed !\n");
    20.         goto cleanup;
    21.     }
    22.  
    23.     pfx = MapViewOfFile(hsection, FILE_MAP_READ, 0, 0, 0);
    24.     if (!pfx) {
    25.         wprintf(L"MapViewOfFile failed !\n");
    26.         goto cleanup;
    27.     }
    28.  
    29.     CRYPT_DATA_BLOB blob;
    30.     blob.cbData = GetFileSize(hfile, 0);
    31.     blob.pbData = (BYTE*)pfx;
    32.     if (!PFXIsPFXBlob(&blob)) {
    33.         wprintf(L"%s is not a valid PFX file\n", filename);
    34.         goto cleanup;
    35.     }
    36.  
    37.     DWORD importFlags = CRYPT_MACHINE_KEYSET|CRYPT_EXPORTABLE;
    38.     pfxStore = PFXImportCertStore(&blob, password, importFlags);
    39.     if (!pfxStore) {
    40.         wprintf(L"PFXImportCertStore failed !\n");
    41.         goto cleanup;
    42.     }
    43.  
    44.     rootStore = CertOpenStore(  CERT_STORE_PROV_SYSTEM, 0, 0,
    45.                                 CERT_STORE_OPEN_EXISTING_FLAG | CERT_SYSTEM_STORE_LOCAL_MACHINE,
    46.                                 L"Root");
    47.     if (!rootStore ) {
    48.         wprintf(L"CertOpenSystemStore Root failed !\n");
    49.         goto cleanup;
    50.     }
    51.  
    52.     PCCERT_CONTEXT pctx;
    53.     pctx = CertEnumCertificatesInStore(pfxStore, 0);
    54.     if (CertAddCertificateContextToStore(rootStore, pctx, CERT_STORE_ADD_NEW, 0)) {
    55.         wprintf(L"Import succeeded.\n");
    56.         goto cleanup;
    57.     }
    58.  
    59. cleanup:
    60.     if (pfxStore) CertCloseStore(pfxStore, CERT_CLOSE_STORE_FORCE_FLAG);
    61.     if (pfx) UnmapViewOfFile(pfx);
    62.     if (hsection) CloseHandle(hsection);
    63.     if (INVALID_HANDLE_VALUE != hfile) CloseHandle(hfile);
    64. }
    65.  
    66. int main()
    67. {
    68.     wchar_t filename[128];
    69.     wchar_t password[128];
    70.     wcscpy_s(filename,L"cacert.pfx");
    71.     wcscpy_s(password, L"doors");
    72.     certImport(filename,password);
    73.     return 0;
    74. }
    Никак не получается для DER... Пожалуйста, если у кого-нибудь есть хоть какие-то мысли - высказываете! Я буду очень признателен. Работа горит! ))
     
  3. SZ

    SZ New Member

    Публикаций:
    0
    Регистрация:
    19 авг 2010
    Сообщения:
    30
    Глянь тут http://www.jacco2.dds.nl/networking/p12imprt.html
    исходник ---> 10. P12imprt source code
    и
    Guide to a Subset of ASN.1, BER, and DER
    http://www.columbia.edu/~ariel/ssleay/layman.html
     
  4. Sidorma

    Sidorma New Member

    Публикаций:
    0
    Регистрация:
    9 дек 2010
    Сообщения:
    35
    SZ Спасибо.
    Увидел пост после того, как сам решил проблему.
    Нужно было просто-напросто немного подумать )
    Вот исходый код:
    Код (Text):
    1. void certImport(wchar_t *filename, wchar_t *password)
    2. {
    3.     HANDLE hfile = INVALID_HANDLE_VALUE;
    4.     HANDLE hsection = 0;
    5.     void* pfx = 0;
    6.     HCERTSTORE rootStore = 0;
    7.  
    8.     hfile = CreateFile(filename, FILE_READ_DATA, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0);
    9.     if (INVALID_HANDLE_VALUE == hfile) wprintf(L"CreateFile failed !\n");
    10.  
    11.     hsection = CreateFileMapping(hfile, 0, PAGE_READONLY, 0, 0, 0);
    12.     if (!hsection) {
    13.         wprintf(L"CreateFileMapping failed !\n");
    14.         goto cleanup;
    15.     }
    16.  
    17.     pfx = MapViewOfFile(hsection, FILE_MAP_READ, 0, 0, 0);
    18.     if (!pfx) {
    19.         wprintf(L"MapViewOfFile failed !\n");
    20.         goto cleanup;
    21.     }
    22.  
    23.     CRYPT_DATA_BLOB blob;
    24.     blob.cbData = GetFileSize(hfile, 0);
    25.     blob.pbData = (BYTE*)pfx;
    26.    
    27.     PCCERT_CONTEXT pctx;
    28.     pctx = CertCreateCertificateContext(X509_ASN_ENCODING | PKCS_7_ASN_ENCODING,blob.pbData,blob.cbData);
    29.  
    30.     rootStore = CertOpenStore(  CERT_STORE_PROV_SYSTEM, 0, 0,
    31.                                 CERT_STORE_OPEN_EXISTING_FLAG | CERT_SYSTEM_STORE_LOCAL_MACHINE,
    32.                                 L"Root");
    33.     if (!rootStore ) {
    34.         wprintf(L"CertOpenSystemStore Root failed !\n");
    35.         goto cleanup;
    36.     }
    37.  
    38.     if (CertAddCertificateContextToStore(rootStore, pctx, CERT_STORE_ADD_NEW, 0)) {
    39.         wprintf(L"Import succeeded.\n");
    40.         goto cleanup;
    41.     }
    42.  
    43. cleanup:
    44.     if (pfx) UnmapViewOfFile(pfx);
    45.     if (hsection) CloseHandle(hsection);
    46.     if (INVALID_HANDLE_VALUE != hfile) CloseHandle(hfile);
    47. }
     
  5. SZ

    SZ New Member

    Публикаций:
    0
    Регистрация:
    19 авг 2010
    Сообщения:
    30
    авот так всегда,
    хорошая мысля приходит апосля )
     
  6. Faost

    Faost New Member

    Публикаций:
    0
    Регистрация:
    30 май 2011
    Сообщения:
    3