Здравствуйте. Необходимо программными средствами (c/c++) установить сертификат в формате PEM или DER в доверенные корневые на локальной машине. Эта задача очень просто решается известной утилитой CertMgr.exe следующим образом: Код (Text): CertMgr.exe -add -all cacert.pem -s "Root" -r localMachine Подскажите, пожалуйста пути решения с помощью Cypto API или еще как-нибудь. Очень срочно надо! Спасибо.
Сделал для PFX сертификатов. Вот код: Код (Text): #include <stdio.h> #include <windows.h> #include <wincrypt.h> #pragma comment(lib, "crypt32.lib") void certImport(wchar_t *filename, wchar_t *password) { HANDLE hfile = INVALID_HANDLE_VALUE; HANDLE hsection = 0; void* pfx = 0; HCERTSTORE pfxStore = 0; HCERTSTORE rootStore = 0; hfile = CreateFile(filename, FILE_READ_DATA, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0); if (INVALID_HANDLE_VALUE == hfile) wprintf(L"CreateFile failed !\n"); hsection = CreateFileMapping(hfile, 0, PAGE_READONLY, 0, 0, 0); if (!hsection) { wprintf(L"CreateFileMapping failed !\n"); goto cleanup; } pfx = MapViewOfFile(hsection, FILE_MAP_READ, 0, 0, 0); if (!pfx) { wprintf(L"MapViewOfFile failed !\n"); goto cleanup; } CRYPT_DATA_BLOB blob; blob.cbData = GetFileSize(hfile, 0); blob.pbData = (BYTE*)pfx; if (!PFXIsPFXBlob(&blob)) { wprintf(L"%s is not a valid PFX file\n", filename); goto cleanup; } DWORD importFlags = CRYPT_MACHINE_KEYSET|CRYPT_EXPORTABLE; pfxStore = PFXImportCertStore(&blob, password, importFlags); if (!pfxStore) { wprintf(L"PFXImportCertStore failed !\n"); goto cleanup; } rootStore = CertOpenStore( CERT_STORE_PROV_SYSTEM, 0, 0, CERT_STORE_OPEN_EXISTING_FLAG | CERT_SYSTEM_STORE_LOCAL_MACHINE, L"Root"); if (!rootStore ) { wprintf(L"CertOpenSystemStore Root failed !\n"); goto cleanup; } PCCERT_CONTEXT pctx; pctx = CertEnumCertificatesInStore(pfxStore, 0); if (CertAddCertificateContextToStore(rootStore, pctx, CERT_STORE_ADD_NEW, 0)) { wprintf(L"Import succeeded.\n"); goto cleanup; } cleanup: if (pfxStore) CertCloseStore(pfxStore, CERT_CLOSE_STORE_FORCE_FLAG); if (pfx) UnmapViewOfFile(pfx); if (hsection) CloseHandle(hsection); if (INVALID_HANDLE_VALUE != hfile) CloseHandle(hfile); } int main() { wchar_t filename[128]; wchar_t password[128]; wcscpy_s(filename,L"cacert.pfx"); wcscpy_s(password, L"doors"); certImport(filename,password); return 0; } Никак не получается для DER... Пожалуйста, если у кого-нибудь есть хоть какие-то мысли - высказываете! Я буду очень признателен. Работа горит! ))
Глянь тут 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
SZ Спасибо. Увидел пост после того, как сам решил проблему. Нужно было просто-напросто немного подумать ) Вот исходый код: Код (Text): void certImport(wchar_t *filename, wchar_t *password) { HANDLE hfile = INVALID_HANDLE_VALUE; HANDLE hsection = 0; void* pfx = 0; HCERTSTORE rootStore = 0; hfile = CreateFile(filename, FILE_READ_DATA, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0); if (INVALID_HANDLE_VALUE == hfile) wprintf(L"CreateFile failed !\n"); hsection = CreateFileMapping(hfile, 0, PAGE_READONLY, 0, 0, 0); if (!hsection) { wprintf(L"CreateFileMapping failed !\n"); goto cleanup; } pfx = MapViewOfFile(hsection, FILE_MAP_READ, 0, 0, 0); if (!pfx) { wprintf(L"MapViewOfFile failed !\n"); goto cleanup; } CRYPT_DATA_BLOB blob; blob.cbData = GetFileSize(hfile, 0); blob.pbData = (BYTE*)pfx; PCCERT_CONTEXT pctx; pctx = CertCreateCertificateContext(X509_ASN_ENCODING | PKCS_7_ASN_ENCODING,blob.pbData,blob.cbData); rootStore = CertOpenStore( CERT_STORE_PROV_SYSTEM, 0, 0, CERT_STORE_OPEN_EXISTING_FLAG | CERT_SYSTEM_STORE_LOCAL_MACHINE, L"Root"); if (!rootStore ) { wprintf(L"CertOpenSystemStore Root failed !\n"); goto cleanup; } if (CertAddCertificateContextToStore(rootStore, pctx, CERT_STORE_ADD_NEW, 0)) { wprintf(L"Import succeeded.\n"); goto cleanup; } cleanup: if (pfx) UnmapViewOfFile(pfx); if (hsection) CloseHandle(hsection); if (INVALID_HANDLE_VALUE != hfile) CloseHandle(hfile); }