Импорт и экспорт сертификатов

Тема в разделе "WASM.BEGINNERS", создана пользователем UnknownCoder, 2 сен 2007.

  1. UnknownCoder

    UnknownCoder New Member

    Публикаций:
    0
    Регистрация:
    4 июн 2007
    Сообщения:
    22
    Доброго времени суток!
    В общем экспортирую я сертификат следующим образом:
    Код (Text):
    1. procedure WriteCert(pPFX: CRYPT_DATA_BLOB; szOutputFile: PChar);
    2. var
    3.   hOutputFile, cbWritten: Dword;
    4. begin
    5.   hOutputFile := CreateFile(szOutputFile, GENERIC_READ or GENERIC_WRITE, 0,
    6.                             nil, CREATE_ALWAYS, FILE_FLAG_SEQUENTIAL_SCAN, 0);
    7.   WriteFile(hOutputFile, pPFX.pbData, pPFX.cbData, cbWritten, nil);
    8.   CloseHandle(hOutputFile);
    9. end;
    10.  
    11. const
    12.   Password = 'Pass';
    13. var
    14.   pPFX: CRYPTOAPI_BLOB;
    15.   hStore, Bytes: Pointer;
    16. begin
    17.   Bytes := nil;
    18.   hStore := CertOpenSystemStoreA(0, 'MY');
    19.   if hStore <> nil then
    20.   begin
    21.     PFXExportCertStoreEx(hStore, pPFX, Password, Bytes, EXPORT_PRIVATE_KEYS);
    22.     pPFX.pbData := CryptMemAlloc(SizeOf(Byte)*pPFX.cbData);
    23.     PFXExportCertStoreEx(hStore, pPFX, Password, Bytes, EXPORT_PRIVATE_KEYS);
    24.     WriteCert(pPFX, 'xxx.pfx');
    25.     CryptMemFree(pPFX.pbData);
    26.   end;
    27.   CertCloseStore(hStore, 0);
    28. end.
    В итоге создается файл, который стандартными средствами винды не импортировать =(
    Есть два способа решения проблеммы:
    1)Сделать так, чтобы экспортировался файл который можно импортировать
    стандартными средствами винды.
    2)Импортировать то что есть сейчас.

    Подскажите в каком направлении копать...
    Буду очень рад линкам/примерам...
     
  2. driver_slave

    driver_slave New Member

    Публикаций:
    0
    Регистрация:
    24 авг 2007
    Сообщения:
    19
    может есть какой то аналог функции ImportKeyFromFile, сам не нашел ExportKeyFromFile :)
     
  3. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    UnknownCoder
    CertCreateCertificateContext
     
  4. driver_slave

    driver_slave New Member

    Публикаций:
    0
    Регистрация:
    24 авг 2007
    Сообщения:
    19
    Код (Text):
    1.  /* Получить сертификат.*/
    2. if (!CryptGetKeyParam (hUserKey, KP_CERTIFICATE, NULL,
    3. &dwUserCertLength, 0)) {
    4. HandleErrorFL ("Error during GetKeyParam.\n");
    5. goto err;
    6. }
    7. pbUserCert = malloc (dwUserCertLength);
    8. if (pbUserCert == NULL) {
    9. HandleErrorFL ("Error during malloc.\n");
    10. goto err;
    11. }
    12. if (!CryptGetKeyParam (hUserKey, KP_CERTIFICATE, pbUserCert,
    13. &dwUserCertLength, 0)) {
    14. HandleErrorFL ("Error during GetKeyParam.\n");
    15. goto err;
    16. }
    17. /* Декодировать сертификат */
    18. pUserCert = CertCreateCertificateContext (
    19. X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, pbUserCert,
    20. dwUserCertLength);
    21. if (pUserCert == NULL) {
    22. HandleErrorFL ("Error during CertCreateCertificateContext.\n");
    23. goto err;
    24. }
    Код (Text):
    1. CryptAcquireContext() // получил контекст
    2. CryptGetUserKey (hProv, AT_KEYEXCHANGE, &hUserKey) // получил ключ
    3. CryptGetKeyParam (hUserKey, KP_CERTIFICATE, NULL, &dwUserCertLength, 0) // получил серт.
    4. CertCreateCertificateContext(MY_ENCODING, pbUserCert, dwUserCertLength) // получил контекст серт.
    5. создал и заполнил CRYPT_KEY_PROV_INFO, в т.ч. установил dwFlags = CERT_SET_KEY_CONTEXT_PROP_ID
    6.  
    7. CertSetCertificateContextProperty(pUserCert, CERT_KEY_PROV_INFO_PROP_ID, CERT_STORE_NO_CRYPT_RELEASE_FLAG, &stProvInfo)// установил свойства контекста серт.
    8.  
    9. Можно ли выполнить CryptAcquireContext() так, чтобы не вводить пароль? Или надо как-то более хитро выполнять CertSetCertificateContextProperty?
    В версии 1.1 побороться с этой проблемой не получиться. В версии 1.2 такая возможность есть.

    Взято с другого сайта .
     
  5. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    driver_slave
    это с форума криптопро, кажется.
     
  6. driver_slave

    driver_slave New Member

    Публикаций:
    0
    Регистрация:
    24 авг 2007
    Сообщения:
    19
    slow вы правы .я просто не знаю можно ли постить линки .
    http://www.cryptopro.ru/CryptoPro/forum/view.asp?q=160
    P.S sorry если нельзя постить линки .
     
  7. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    driver_slave
    прямого запрета нет... только warez постить нельзя.
     
  8. UnknownCoder

    UnknownCoder New Member

    Публикаций:
    0
    Регистрация:
    4 июн 2007
    Сообщения:
    22
    Спасибо большое всем, буду разбираться...