Доброго времени суток! В общем экспортирую я сертификат следующим образом: Код (Text): procedure WriteCert(pPFX: CRYPT_DATA_BLOB; szOutputFile: PChar); var hOutputFile, cbWritten: Dword; begin hOutputFile := CreateFile(szOutputFile, GENERIC_READ or GENERIC_WRITE, 0, nil, CREATE_ALWAYS, FILE_FLAG_SEQUENTIAL_SCAN, 0); WriteFile(hOutputFile, pPFX.pbData, pPFX.cbData, cbWritten, nil); CloseHandle(hOutputFile); end; const Password = 'Pass'; var pPFX: CRYPTOAPI_BLOB; hStore, Bytes: Pointer; begin Bytes := nil; hStore := CertOpenSystemStoreA(0, 'MY'); if hStore <> nil then begin PFXExportCertStoreEx(hStore, pPFX, Password, Bytes, EXPORT_PRIVATE_KEYS); pPFX.pbData := CryptMemAlloc(SizeOf(Byte)*pPFX.cbData); PFXExportCertStoreEx(hStore, pPFX, Password, Bytes, EXPORT_PRIVATE_KEYS); WriteCert(pPFX, 'xxx.pfx'); CryptMemFree(pPFX.pbData); end; CertCloseStore(hStore, 0); end. В итоге создается файл, который стандартными средствами винды не импортировать =( Есть два способа решения проблеммы: 1)Сделать так, чтобы экспортировался файл который можно импортировать стандартными средствами винды. 2)Импортировать то что есть сейчас. Подскажите в каком направлении копать... Буду очень рад линкам/примерам...
Код (Text): /* Получить сертификат.*/ if (!CryptGetKeyParam (hUserKey, KP_CERTIFICATE, NULL, &dwUserCertLength, 0)) { HandleErrorFL ("Error during GetKeyParam.\n"); goto err; } pbUserCert = malloc (dwUserCertLength); if (pbUserCert == NULL) { HandleErrorFL ("Error during malloc.\n"); goto err; } if (!CryptGetKeyParam (hUserKey, KP_CERTIFICATE, pbUserCert, &dwUserCertLength, 0)) { HandleErrorFL ("Error during GetKeyParam.\n"); goto err; } /* Декодировать сертификат */ pUserCert = CertCreateCertificateContext ( X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, pbUserCert, dwUserCertLength); if (pUserCert == NULL) { HandleErrorFL ("Error during CertCreateCertificateContext.\n"); goto err; } Код (Text): CryptAcquireContext() // получил контекст CryptGetUserKey (hProv, AT_KEYEXCHANGE, &hUserKey) // получил ключ CryptGetKeyParam (hUserKey, KP_CERTIFICATE, NULL, &dwUserCertLength, 0) // получил серт. CertCreateCertificateContext(MY_ENCODING, pbUserCert, dwUserCertLength) // получил контекст серт. создал и заполнил CRYPT_KEY_PROV_INFO, в т.ч. установил dwFlags = CERT_SET_KEY_CONTEXT_PROP_ID CertSetCertificateContextProperty(pUserCert, CERT_KEY_PROV_INFO_PROP_ID, CERT_STORE_NO_CRYPT_RELEASE_FLAG, &stProvInfo)// установил свойства контекста серт. Можно ли выполнить CryptAcquireContext() так, чтобы не вводить пароль? Или надо как-то более хитро выполнять CertSetCertificateContextProperty? В версии 1.1 побороться с этой проблемой не получиться. В версии 1.2 такая возможность есть. Взято с другого сайта .
slow вы правы .я просто не знаю можно ли постить линки . http://www.cryptopro.ru/CryptoPro/forum/view.asp?q=160 P.S sorry если нельзя постить линки .