| ||||
| ||||
я получаю по сети сертификат в буфер, для того чтобы его установить я сохраняю его в файл и открываю с помощью CertOpenStore с флагом CERT_STORE_PROV_FILENAME. Можно ли каким либо образом открыть хранилище из буфера не прибегая к созданию промежуточного файла? | ||||
Ответы: | ||||
| ||||
Можно, но зависит от того как оно в буфер сохранено. Посмотрите CERT_STORE_PROV_PKCS7 и CERT_STORE_PROV_SERIALIZED. | ||||
| ||||
сертификат представлен в буфере таким образом: -----BEGIN CERTIFICATE----- MIICoDCCAgmgAwIBAgIBADANBgkqhkiG9w0BAQQFADBFMQswCQYDVQQGEwJBVTET ... KRY9aYgKz3IUCXGF/Z6AFlT+4zrcutplMllu/wNDE9vNa1z8eUUC5kdGFSStuq2c HE/TOQ== -----END CERTIFICATE----- | ||||
| ||||
Если это простой сертификат и не хочется возиться с временными файлами, то надо преобразовать из base64 в der и воспользоваться CertCreateCertificateContext. | ||||
| ||||
в таком случае прийдется из буфера выделять непоследственно Base64 часть, т.е. убирать "-----BEGIN CERTIFICATE-----" и "-----END CERTIFICATE-----"? Кстати чтобы экспортировать сертификат из хранилища в том же виде нужно проделать обратную операцию или есть другие методы? | ||||
| ||||
Да, придется. Если экспортировать в base64 то именно так. | ||||
| ||||
TCHAR buf[1024]; //тут наш сертификат TCHAR tszTempPath[MAX_PATH]; ::GetTempPath(MAX_PATH, tszTempPath); TCHAR tszTempFileName[MAX_PATH]; ::GetTempFileName(tszTempPath, _T(""), 0, tszTempFileName); //создаем такой файл который удалиться сразу по закрытию HANDLE hFile = ::CreateFile(tszTempFileName, GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_FLAG_DELETE_ON_CLOSE | FILE_ATTRIBUTE_TEMPORARY, NULL); //запишем буфер в файл DWORD dwWritten; ::WriteFile(hFile, buf, 1024, &dwWritten, NULL); //позиционируемся в начало ::SetFilePointer(hFile, 0, 0, FILE_BEGIN)); //открываем по handle HCERTSTORE hCertStore = ::CertOpenStore(CERT_STORE_PROV_FILE, PKCS_7_ASN_ENCODING | X509_ASN_ENCODING, NULL, CERT_STORE_OPEN_EXISTING_FLAG, hFile); но тут hCertStore = 0; GetLastError() возвращает CRYPT_E_FILE_ERROR почему? вариант с CERT_STORE_PROV_FILENAME работает | ||||
| ||||
Потому что CERT_STORE_PROV_FILE:... This provider expects the file to contain only a serialized store and not either PKCS #7 signed messages or a single encoded certificate. А CERT_STORE_PROV_FILENAME_A:... The provider opens the file and first attempts to read the file as a serialized store, then as a PKCS #7 signed message, and finally as a single encoded certificate. | ||||
| ||||
не понял... :-/ получается что с CERT_STORE_PROV_FILE можно открывать только serialized store сертификат? а PKCS #7 signed messages и single encoded нельзя?.. А CERT_STORE_PROV_FILENAME_A:... The provider opens the file and first attempts to read the file as a serialized store, then as a PKCS #7 signed message, and finally as a single encoded certificate. | ||||
| ||||
Да, все именно так. | ||||
| ||||
спасибо за помощь, я потратил на это много времени... еще раз спасибо | ||||