lomik_xp |
|
Статус: Новичок Группы: Участники Сказал(а) «Спасибо»: 5 раз |
Методом тыка выяснил что при добавлении флага CERT_STORE_NO_CRYPT_RELEASE_FLAG валится с ошибкой |
|
|
Андрей * |
|
Статус: Сотрудник Группы: Участники Сказал «Спасибо»: 460 раз |
Здравствуйте. В 5.0.12417 исправлено, поэтому нет ошибки. |
Техническую поддержку оказываем тут |
|
|
WWW |
|
lomik_xp
оставлено 22.06.2022(UTC) |
Зубов Иван |
|
Статус: Сотрудник Группы: Участники Сказал «Спасибо»: 6 раз |
Здравствуйте! В документации на функцию указано: Цитата: [in] hCryptProv Цитата: CERT_STORE_NO_CRYPT_RELEASE_FLAG https://docs.microsoft.c…f-wincrypt-certopenstore Поэтому рекомендуем не задавать ни hCryptProv, ни CERT_STORE_NO_CRYPT_RELEASE_FLAG. Так будет правильно работать на всех версиях CSP. Если некоторое странное поведение из старой версии не проявляется на более новой версии, то соответственно углубляться в вопрос, почему так, не очень хочется |
Техническую поддержку оказываем тут |
|
|
|
|
lomik_xp
оставлено 22.06.2022(UTC) |
lomik_xp |
|
Статус: Новичок Группы: Участники Сказал(а) «Спасибо»: 5 раз |
Спасибо за ответы, попробую завтра, без hProv и флага, тему можно закрыть ответы исчерпывающие |
|
|
Пользователи, просматривающие эту тему |
Guest |
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
-
#1
Hi All,
I am trying to open store in my Smartphone application as follows:
systemStore = CertOpenStore(
CERT_STORE_PROV_SYSTEM,
0,
NULL,
CERT_STORE_ENUM_ARCHIVED_FLAG /*LOWORD*/ |
CERT_SYSTEM_STORE_LOCAL_MACHINE /*HIWORD*/,
_T(«ROOT»));
DWORD dwErr = GetLastError();
Here it gives me Error #5 which is «Access is denied.». My application
tries to connect to a remote server which i had given certificate.
My Pocket PC client works well with
systemStore = CertOpenSystemStoreW(NULL, _T(«ROOT»));
Here i get a valid handle to the store when i connect to the same
server.
Rest of the things are same in both the cases there is only difference
of API used to open the store.
Can anyone tell me what can be the possible reason behind it.
Thanks in Advance,
Ansh
/* Reads certificates from the list of known locations. Stops when any * location contains any certificates, to prevent spending unnecessary time * adding redundant certificates, e.g. when both a certificate bundle and * individual certificates exist in the same directory. */ static PWINECRYPT_CERTSTORE CRYPT_RootOpenStoreFromKnownLocations(void) { HCERTSTORE root = NULL; HCERTSTORE from = CertOpenStore(CERT_STORE_PROV_MEMORY, X509_ASN_ENCODING, 0, CERT_STORE_CREATE_NEW_FLAG, NULL); HCERTSTORE to = CertOpenStore(CERT_STORE_PROV_MEMORY, X509_ASN_ENCODING, 0, CERT_STORE_CREATE_NEW_FLAG, NULL); if (from && to) { CERT_STORE_PROV_INFO provInfo = { sizeof(CERT_STORE_PROV_INFO), sizeof(rootProvFuncs) / sizeof(rootProvFuncs[0]), rootProvFuncs, NULL, 0, NULL }; DWORD i; BOOL ret = FALSE; for (i = 0; !ret && i < sizeof(CRYPT_knownLocations) / sizeof(CRYPT_knownLocations[0]); i++) ret = import_certs_from_path(CRYPT_knownLocations[i], from, TRUE); check_and_store_certs(from, to); root = CRYPT_ProvCreateStore(0, to, &provInfo); } CertCloseStore(from, 0); TRACE("returning %p\n", root); return root; }
int _gnutls_x509_crt_import_system_url(gnutls_x509_crt_t crt, const char *url) { uint8_t id[MAX_WID_SIZE]; HCERTSTORE store = NULL; size_t id_size; const CERT_CONTEXT *cert = NULL; CRYPT_HASH_BLOB blob; int ret; gnutls_datum_t data; if (ncrypt_init == 0) return gnutls_assert_val(GNUTLS_E_UNIMPLEMENTED_FEATURE); id_size = sizeof(id); ret = get_id(url, id, &id_size, 0); if (ret < 0) return gnutls_assert_val(ret); blob.cbData = id_size; blob.pbData = id; store = CertOpenStore(CERT_STORE_PROV_SYSTEM, 0, 0, CERT_SYSTEM_STORE_CURRENT_USER, L"MY"); if (store == NULL) { gnutls_assert(); ret = GNUTLS_E_FILE_ERROR; goto cleanup; } cert = CertFindCertificateInStore(store, X509_ASN_ENCODING, 0, CERT_FIND_KEY_IDENTIFIER, &blob, NULL); if (cert == NULL) { char buf[64]; _gnutls_debug_log("cannot find ID: %s from %s\n", _gnutls_bin2hex(id, id_size, buf, sizeof(buf), NULL), url); ret = gnutls_assert_val(GNUTLS_E_REQUESTED_DATA_NOT_AVAILABLE); goto cleanup; } data.data = cert->pbCertEncoded; data.size = cert->cbCertEncoded; ret = gnutls_x509_crt_import(crt, &data, GNUTLS_X509_FMT_DER); if (ret < 0) { gnutls_assert(); goto cleanup; } ret = 0; cleanup: if (cert != 0) CertFreeCertificateContext(cert); CertCloseStore(store, 0); return ret; }
bool mod_crypto::CertCTXtoPFX(PCCERT_CONTEXT certCTX, wstring pfxFile, wstring password) { bool retour = false; HCERTSTORE hTempStore = CertOpenStore(CERT_STORE_PROV_MEMORY, 0, NULL, CERT_STORE_CREATE_NEW_FLAG, NULL); PCCERT_CONTEXT pCertContextCopy = NULL; if(CertAddCertificateContextToStore(hTempStore, certCTX, CERT_STORE_ADD_NEW, &pCertContextCopy)) { CRYPT_DATA_BLOB bDataBlob = {0, NULL}; if(PFXExportCertStoreEx(hTempStore, &bDataBlob, password.c_str(), NULL, EXPORT_PRIVATE_KEYS | REPORT_NOT_ABLE_TO_EXPORT_PRIVATE_KEY)) { bDataBlob.pbData = new BYTE[bDataBlob.cbData]; if(PFXExportCertStoreEx(hTempStore, &bDataBlob, password.c_str(), NULL, EXPORT_PRIVATE_KEYS | REPORT_NOT_ABLE_TO_EXPORT_PRIVATE_KEY)) { HANDLE hFile = CreateFile(pfxFile.c_str(), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL); if(hFile && hFile != INVALID_HANDLE_VALUE) { DWORD dwBytesWritten; if(WriteFile(hFile, bDataBlob.pbData, bDataBlob.cbData, &dwBytesWritten, NULL) && (bDataBlob.cbData == dwBytesWritten)) { retour = FlushFileBuffers(hFile) != 0; } CloseHandle(hFile); } } delete[] bDataBlob.pbData; } CertFreeCertificateContext(pCertContextCopy); } CertCloseStore(hTempStore, CERT_CLOSE_STORE_FORCE_FLAG); return retour; }
bool SelectCertificate(const std::wstring& certStoreName, const std::string& certHash) { certStore = CertOpenStore(CERT_STORE_PROV_SYSTEM, 0, NULL, CERT_SYSTEM_STORE_CURRENT_USER, certStoreName.c_str()); if (!certStore) { std::wcerr << L"Failed to open cert store. Error: " << std::hex << GetLastError() << L", Store: " << certStoreName << std::endl; return false; } CRYPT_HASH_BLOB hashBlob; hashBlob.pbData = (BYTE*)certHash.data(); hashBlob.cbData = (DWORD)certHash.size(); CERT_ID id; id.dwIdChoice = CERT_ID_SHA1_HASH; id.HashId = hashBlob; certContext = CertFindCertificateInStore(certStore, X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, 0, CERT_FIND_CERT_ID, (void *)&id, NULL); if (!certContext) { std::cerr << "Failed to open cert context. Error: " << std::hex << GetLastError() << ", Certificate: " << certHash << std::endl; return false; } return true; }
//Function to obtain the certificate PCCERT_CONTEXT MyGetCertificate (void) { //--------------------------------------------------------- // Declare and initialize variables. HCERTSTORE hStoreHandle; // The system store handle. PCCERT_CONTEXT pCert = NULL; // Set to NULL for the first call to // CertFindCertificateInStore. //------------------------------------------------------------------- // Open the certificate store to be searched. hStoreHandle = CertOpenStore( CERT_STORE_PROV_SYSTEM, // the store provider type 0, // the encoding type is not needed NULL, // use the default HCRYPTPROV CERT_SYSTEM_STORE_CURRENT_USER, // set the store location in a // registry location CERT_STORE_NAME); // the store name if (NULL == hStoreHandle) { wprintf( L"Could not open the store.\n"); goto done; } else { wprintf( L"Opened the store.\n"); } //------------------------------------------------------------------- // Get a certificate that has the specified Subject Name pCert = CertFindCertificateInStore( hStoreHandle, CRYPT_ASN_ENCODING, // Use X509_ASN_ENCODING 0, // No dwFlags needed CERT_FIND_SUBJECT_STR, // Find a certificate with a // subject that matches the // string in the next parameter SUBJECT_NAME, // The Unicode string to be found // in a certificate's subject NULL); // NULL for the first call to the // function; In all subsequent // calls, it is the last pointer // returned by the function if (NULL == pCert) { wprintf( L"Could not find the desired certificate.\n"); } else { wprintf( L"The desired certificate was found. \n"); } done: if(NULL != hStoreHandle) { CertCloseStore( hStoreHandle, 0); } return pCert; }
static PWINECRYPT_CERTSTORE CRYPT_SerializedOpenStore(HCRYPTPROV hCryptProv, DWORD dwFlags, const void *pvPara) { HCERTSTORE store; const CRYPT_DATA_BLOB *data = pvPara; TRACE("(%ld, %08x, %p)\n", hCryptProv, dwFlags, pvPara); if (dwFlags & CERT_STORE_DELETE_FLAG) { SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return NULL; } store = CertOpenStore(CERT_STORE_PROV_MEMORY, 0, 0, CERT_STORE_CREATE_NEW_FLAG, NULL); if (store) { if (!CRYPT_ReadSerializedStoreFromBlob(data, store)) { CertCloseStore(store, 0); store = NULL; } } TRACE("returning %p\n", store); return (PWINECRYPT_CERTSTORE)store; }
/** * Opens a certificate store. * * @returns true on success, false on failure (error message written). * @param dwDst The destination, like * CERT_SYSTEM_STORE_LOCAL_MACHINE or * CERT_SYSTEM_STORE_CURRENT_USER. * @param pszStoreNm The store name. */ static HCERTSTORE openCertStore(DWORD dwDst, const char *pszStoreNm) { HCERTSTORE hStore = NULL; PRTUTF16 pwszStoreNm; int rc = RTStrToUtf16(pszStoreNm, &pwszStoreNm); if (RT_SUCCESS(rc)) { /* * Make sure CERT_STORE_OPEN_EXISTING_FLAG is not set. This causes Windows XP * to return ACCESS_DENIED when installing TrustedPublisher certificates via * CertAddCertificateContextToStore() if the TrustedPublisher store never has * been used (through certmgr.exe and friends) yet. * * According to MSDN, if neither CERT_STORE_OPEN_EXISTING_FLAG nor * CERT_STORE_CREATE_NEW_FLAG is set, the store will be either opened or * created accordingly. */ dwDst &= ~CERT_STORE_OPEN_EXISTING_FLAG; hStore = CertOpenStore(CERT_STORE_PROV_SYSTEM_W, PKCS_7_ASN_ENCODING | X509_ASN_ENCODING, NULL /* hCryptProv = default */, dwDst, pwszStoreNm); RTUtf16Free(pwszStoreNm); } return hStore; }
/*TODO: Not supported*/ int KSI_PKITruststore_addLookupFile(KSI_PKITruststore *trust, const char *path) { int res = KSI_UNKNOWN_ERROR; HCERTSTORE tmp_FileTrustStore = NULL; char buf[1024]; if (trust == NULL || path == NULL){ res = KSI_INVALID_ARGUMENT; goto cleanup; } KSI_ERR_clearErrors(trust->ctx); /*Open new store */ tmp_FileTrustStore = CertOpenStore(CERT_STORE_PROV_FILENAME_A, 0, 0, 0, path); if (tmp_FileTrustStore == NULL) { KSI_LOG_debug(trust->ctx, "%s", getMSError(GetLastError(), buf, sizeof(buf))); KSI_pushError(trust->ctx, res = KSI_INVALID_FORMAT, NULL); goto cleanup; } /*Update with priority 0 store*/ if (!CertAddStoreToCollection(trust->collectionStore, tmp_FileTrustStore, 0, 0)) { KSI_LOG_debug(trust->ctx, "%s", getMSError(GetLastError(), buf, sizeof(buf))); KSI_pushError(trust->ctx, res = KSI_INVALID_FORMAT, NULL); goto cleanup; } tmp_FileTrustStore = NULL; res = KSI_OK; cleanup: if (tmp_FileTrustStore) CertCloseStore(tmp_FileTrustStore, CERT_CLOSE_STORE_CHECK_FLAG); return res; }
void doit(void) { HCERTSTORE hStore = CertOpenStore(CERT_STORE_PROV_SYSTEM, 0, 0, CERT_SYSTEM_STORE_CURRENT_USER , L"ROOT"); assert(hStore != NULL); HCERTSTORE hSystemStore = CertOpenSystemStore(0, "ROOT"); assert(hSystemStore != NULL); PCCERT_CONTEXT prevCtx = NULL; PCCERT_CONTEXT ctx = NULL; PCCERT_CONTEXT sysPrevCtx = NULL; PCCERT_CONTEXT sysCtx = NULL; while (1) { ctx = CertEnumCertificatesInStore(hStore, prevCtx); sysCtx = CertEnumCertificatesInStore(hSystemStore, sysPrevCtx); if (ctx == NULL || sysCtx == NULL) break; if (CertCompareIntegerBlob(&ctx->pCertInfo->SerialNumber, &sysCtx->pCertInfo->SerialNumber) != TRUE) assert(0); prevCtx = ctx; sysPrevCtx = sysCtx; } assert(ctx == NULL && sysCtx == NULL); CertCloseStore(hStore, 0); CertCloseStore(hSystemStore, 0); }
/* Returns TRUE if pCert is not in the Disallowed system store, or FALSE if it * is. */ static BOOL CRYPTDLG_IsCertAllowed(PCCERT_CONTEXT pCert) { BOOL ret; BYTE hash[20]; DWORD size = sizeof(hash); if ((ret = CertGetCertificateContextProperty(pCert, CERT_SIGNATURE_HASH_PROP_ID, hash, &size))) { static const WCHAR disallowedW[] = { 'D','i','s','a','l','l','o','w','e','d',0 }; HCERTSTORE disallowed = CertOpenStore(CERT_STORE_PROV_SYSTEM_W, X509_ASN_ENCODING, 0, CERT_SYSTEM_STORE_CURRENT_USER, disallowedW); if (disallowed) { PCCERT_CONTEXT found = CertFindCertificateInStore(disallowed, X509_ASN_ENCODING, 0, CERT_FIND_SIGNATURE_HASH, hash, NULL); if (found) { ret = FALSE; CertFreeCertificateContext(found); } CertCloseStore(disallowed, 0); } } return ret; }
RCF::ByteBuffer Win32Certificate::exportToPfx() { PCCERT_CONTEXT pContext = getWin32Context(); // Create in-memory store HCERTSTORE hMemoryStore; hMemoryStore = CertOpenStore( CERT_STORE_PROV_MEMORY, // Memory store 0, // Encoding type, not used with a memory store NULL, // Use the default provider 0, // No flags NULL); // Not needed DWORD dwErr = GetLastError(); RCF_VERIFY( hMemoryStore, Exception(_RcfError_ApiError("CertOpenStore()"), dwErr)); // Add the certificate. BOOL ok = CertAddCertificateContextToStore( hMemoryStore, // Store handle pContext, // Pointer to a certificate CERT_STORE_ADD_USE_EXISTING, NULL); dwErr = GetLastError(); RCF_VERIFY( ok, Exception(_RcfError_ApiError("CertAddCertificateContextToStore()"), dwErr)); // Export in-memory store. CRYPT_DATA_BLOB pfxBlob = {}; BOOL exportOk = PFXExportCertStore(hMemoryStore, &pfxBlob, L"", 0/*EXPORT_PRIVATE_KEYS*/); dwErr = GetLastError(); RCF_VERIFY( exportOk, Exception(_RcfError_ApiError("PFXExportCertStore()"), dwErr)); RCF::ByteBuffer pfxBuffer(pfxBlob.cbData); pfxBlob.pbData = (BYTE *) pfxBuffer.getPtr(); exportOk = PFXExportCertStore(hMemoryStore, &pfxBlob, L"", 0/*EXPORT_PRIVATE_KEYS*/); dwErr = GetLastError(); RCF_VERIFY( exportOk, Exception(_RcfError_ApiError("PFXExportCertStore()"), dwErr)); CertCloseStore(hMemoryStore, 0); return pfxBuffer; }
// usage: DumpCertsFromSst <output directory> <SST file 1> ... <SST file n> int _tmain(int argc, _TCHAR* argv[]) { SECURITY_ATTRIBUTES sa; memset(&sa, 0, sizeof(SECURITY_ATTRIBUTES)); sa.nLength = sizeof(SECURITY_ATTRIBUTES); sa.bInheritHandle = FALSE; if(argc < 2) { std::cout << "At least one argument must be provided: sstFile1 sstFile2 ... sstFileN etc" << std::endl; return 0; } for(int ii = 1; ii < argc; ++ii) { HANDLE hFile = NULL; HCERTSTORE hFileStore = NULL; LPCWSTR pszFileName = argv[ii]; //Open file hFile = CreateFile(pszFileName, GENERIC_READ, 0, &sa, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if(INVALID_HANDLE_VALUE == hFile) { std::wcout << "Failed to open file: " << pszFileName << std::endl; continue; } else { std::wcout << "Processing file: " << pszFileName << std::endl; } //open certificate store hFileStore = CertOpenStore(CERT_STORE_PROV_FILE, 0, NULL, CERT_STORE_READONLY_FLAG, hFile); if(NULL == hFileStore) { CloseHandle(hFile); continue; } int count = 0; PCCERT_CONTEXT pPrevCertContext = NULL; pPrevCertContext = CertEnumCertificatesInStore(hFileStore, pPrevCertContext); while(NULL != pPrevCertContext) { if(WriteToFileWithHashAsFilename(pPrevCertContext)) ++count; pPrevCertContext = CertEnumCertificatesInStore(hFileStore, pPrevCertContext); } std::wcout << "Wrote " << count << " certificates" << std::endl; CloseHandle(hFile); CertCloseStore(hFileStore, 0); } return 1; }
static int netconn_secure_verify( int preverify_ok, X509_STORE_CTX *ctx ) { SSL *ssl; WCHAR *server; BOOL ret = FALSE; netconn_t *conn; ssl = pX509_STORE_CTX_get_ex_data( ctx, pSSL_get_ex_data_X509_STORE_CTX_idx() ); server = pSSL_get_ex_data( ssl, hostname_idx ); conn = pSSL_get_ex_data( ssl, conn_idx ); if (preverify_ok) { HCERTSTORE store = CertOpenStore( CERT_STORE_PROV_MEMORY, 0, 0, CERT_STORE_CREATE_NEW_FLAG, NULL ); if (store) { X509 *cert; int i; PCCERT_CONTEXT endCert = NULL; ret = TRUE; for (i = 0; ret && i < psk_num((struct stack_st *)ctx->chain); i++) { PCCERT_CONTEXT context; cert = (X509 *)psk_value((struct stack_st *)ctx->chain, i); if ((context = X509_to_cert_context( cert ))) { if (i == 0) ret = CertAddCertificateContextToStore( store, context, CERT_STORE_ADD_ALWAYS, &endCert ); else ret = CertAddCertificateContextToStore( store, context, CERT_STORE_ADD_ALWAYS, NULL ); CertFreeCertificateContext( context ); } } if (!endCert) ret = FALSE; if (ret) { DWORD_PTR err = netconn_verify_cert( endCert, store, server, conn->security_flags ); if (err) { pSSL_set_ex_data( ssl, error_idx, (void *)err ); ret = FALSE; } } CertFreeCertificateContext( endCert ); CertCloseStore( store, 0 ); } } return ret; }
static HCERTCHAINENGINE CRYPTDLG_MakeEngine(CERT_VERIFY_CERTIFICATE_TRUST *cert) { HCERTCHAINENGINE engine = NULL; HCERTSTORE root = NULL, trust = NULL; DWORD i; if (cert->cRootStores) { root = CertOpenStore(CERT_STORE_PROV_COLLECTION, 0, 0, CERT_STORE_CREATE_NEW_FLAG, NULL); if (root) { for (i = 0; i < cert->cRootStores; i++) CertAddStoreToCollection(root, cert->rghstoreRoots[i], 0, 0); } } if (cert->cTrustStores) { trust = CertOpenStore(CERT_STORE_PROV_COLLECTION, 0, 0, CERT_STORE_CREATE_NEW_FLAG, NULL); if (root) { for (i = 0; i < cert->cTrustStores; i++) CertAddStoreToCollection(trust, cert->rghstoreTrust[i], 0, 0); } } if (cert->cRootStores || cert->cStores || cert->cTrustStores) { CERT_CHAIN_ENGINE_CONFIG config; memset(&config, 0, sizeof(config)); config.cbSize = sizeof(config); config.hRestrictedRoot = root; config.hRestrictedTrust = trust; config.cAdditionalStore = cert->cStores; config.rghAdditionalStore = cert->rghstoreCAs; config.hRestrictedRoot = root; CertCreateCertificateChainEngine(&config, &engine); CertCloseStore(root, 0); CertCloseStore(trust, 0); } return engine; }
HCERTSTORE WINAPI CertOpenSystemStoreW(HCRYPTPROV_LEGACY hProv, LPCWSTR szSubSystemProtocol) { if (!szSubSystemProtocol) { SetLastError(E_INVALIDARG); return 0; } return CertOpenStore(CERT_STORE_PROV_SYSTEM_W, 0, hProv, CERT_SYSTEM_STORE_CURRENT_USER, szSubSystemProtocol); }
static int op_capi_new(X509_LOOKUP *_lu) { HCERTSTORE h_store; h_store=CertOpenStore(CERT_STORE_PROV_SYSTEM_A,0,0, CERT_STORE_OPEN_EXISTING_FLAG|CERT_STORE_READONLY_FLAG| CERT_SYSTEM_STORE_CURRENT_USER|CERT_STORE_SHARE_CONTEXT_FLAG,"ROOT"); if(h_store!=NULL) { _lu->method_data=(char *)h_store; return 1; } return 0; }
HCERTSTORE WINAPI CryptGetMessageCertificates(DWORD dwMsgAndCertEncodingType, HCRYPTPROV_LEGACY hCryptProv, DWORD dwFlags, const BYTE* pbSignedBlob, DWORD cbSignedBlob) { CRYPT_DATA_BLOB blob = { cbSignedBlob, (LPBYTE)pbSignedBlob }; TRACE("(%08x, %ld, %d08x %p, %d)\n", dwMsgAndCertEncodingType, hCryptProv, dwFlags, pbSignedBlob, cbSignedBlob); return CertOpenStore(CERT_STORE_PROV_PKCS7, dwMsgAndCertEncodingType, hCryptProv, dwFlags, &blob); }
/* Initializes SSL and allocate global context SSL_context SYNOPSIS ma_tls_start RETURN VALUES 0 success 1 error */ int ma_tls_start(char *errmsg, size_t errmsg_len) { if (!ma_tls_initialized) { pthread_mutex_init(&LOCK_schannel_config,MY_MUTEX_INIT_FAST); pthread_mutex_lock(&LOCK_schannel_config); if (!ca_CertStore) { if (!(ca_CertStore = CertOpenStore(CERT_STORE_PROV_MEMORY, 0, 0, 0, NULL)) || !(crl_CertStore = CertOpenStore(CERT_STORE_PROV_MEMORY, 0, 0, 0, NULL))) { snprintf(errmsg, errmsg_len, "Can't open in-memory certstore. Error=%d", GetLastError()); return 1; } } ma_tls_initialized = TRUE; pthread_mutex_unlock(&LOCK_schannel_config); } return 0; }
static BOOL WINTRUST_CreateChainForSigner(CRYPT_PROVIDER_DATA *data, DWORD signer, PWTD_GENERIC_CHAIN_POLICY_CREATE_INFO createInfo, PCERT_CHAIN_PARA chainPara) { BOOL ret = TRUE; HCERTSTORE store = NULL; if (data->chStores) { store = CertOpenStore(CERT_STORE_PROV_COLLECTION, 0, 0, CERT_STORE_CREATE_NEW_FLAG, NULL); if (store) { DWORD i; for (i = 0; i < data->chStores; i++) CertAddStoreToCollection(store, data->pahStores[i], 0, 0); } } /* Expect the end certificate for each signer to be the only cert in the * chain: */ if (data->pasSigners[signer].csCertChain) { /* Create a certificate chain for each signer */ ret = CertGetCertificateChain(createInfo->hChainEngine, data->pasSigners[signer].pasCertChain[0].pCert, &data->pasSigners[signer].sftVerifyAsOf, store, chainPara, createInfo->dwFlags, createInfo->pvReserved, &data->pasSigners[signer].pChainContext); if (ret) { if (data->pasSigners[signer].pChainContext->cChain != 1) { FIXME("unimplemented for more than 1 simple chain\n"); ret = FALSE; } else { if ((ret = WINTRUST_CopyChain(data, signer))) { if (data->psPfns->pfnCertCheckPolicy) ret = data->psPfns->pfnCertCheckPolicy(data, signer, FALSE, 0); else TRACE("no cert check policy, skipping policy check\n"); } } } } CertCloseStore(store, 0); return ret; }
static HCERTSTORE DigiCrypt_OpenStore(void) { HCERTSTORE hStore; hStore = CertOpenStore(CERT_STORE_PROV_SYSTEM,0,(HCRYPTPROV)NULL, CERT_SYSTEM_STORE_CURRENT_USER | CERT_STORE_READONLY_FLAG | CERT_STORE_OPEN_EXISTING_FLAG,L"MY"); //hStore = CertOpenStore(CERT_STORE_PROV_SYSTEM,0,(HCRYPTPROV)NULL,CERT_SYSTEM_STORE_CURRENT_USER,L"MY"); //hStore = CertOpenStore(CERT_STORE_PROV_SYSTEM,0,(HCRYPTPROV)NULL,CERT_SYSTEM_STORE_CURRENT_USER | CERT_STORE_BACKUP_RESTORE_FLAG | //CERT_STORE_READONLY_FLAG | CERT_STORE_OPEN_EXISTING_FLAG,L"MY"); return(hStore); }
PCCERT_CONTEXT GetCertificateContextFromName( LPTSTR lpszCertificateName, LPTSTR lpszCertificateStoreName, DWORD dwCertStoreOpenFlags) { PCCERT_CONTEXT pCertContext = NULL; HCERTSTORE hCertStore = NULL; LPSTR szStoreProvider; DWORD dwFindType; #ifdef UNICODE szStoreProvider = (LPSTR)CERT_STORE_PROV_SYSTEM_W; #else szStoreProvider = (LPSTR)CERT_STORE_PROV_SYSTEM_A; #endif // Open the specified certificate store hCertStore = CertOpenStore(szStoreProvider, 0, NULL, CERT_STORE_READONLY_FLAG| dwCertStoreOpenFlags, lpszCertificateStoreName); if (hCertStore == NULL) { MyPrintf(_T("CertOpenStore failed with %X\n"), GetLastError()); return pCertContext; } #ifdef UNICODE dwFindType = CERT_FIND_SUBJECT_STR_W; #else dwFindType = CERT_FIND_SUBJECT_STR_A; #endif // Find the certificate by CN. pCertContext = CertFindCertificateInStore( hCertStore, MY_ENCODING, 0, dwFindType, lpszCertificateName, NULL); if (pCertContext == NULL) { MyPrintf(_T("CertFindCertificateInStore failed with %X\n"), GetLastError()); } CertCloseStore(hCertStore, 0); return pCertContext; }
// This imports the certificates in a given Windows certificate store into an // X509_STORE for // openssl to use during certificate validation. static int importCertStoreToX509_STORE( LPWSTR storeName, DWORD storeLocation, X509_STORE* verifyStore, char* err, size_t err_len) { int status = 1; X509* x509Cert = NULL; HCERTSTORE systemStore = CertOpenStore(CERT_STORE_PROV_SYSTEM_W, 0, (HCRYPTPROV)NULL, storeLocation | CERT_STORE_READONLY_FLAG, storeName); if (systemStore == NULL) { formatError(GetLastError(),"error opening system CA store",err,err_len); status = 0; goto CLEANUP; } PCCERT_CONTEXT certCtx = NULL; while ((certCtx = CertEnumCertificatesInStore(systemStore, certCtx)) != NULL) { const uint8_t * certBytes = (const uint8_t *)(certCtx->pbCertEncoded); x509Cert = d2i_X509(NULL, &certBytes, certCtx->cbCertEncoded); if (x509Cert == NULL) { // 120 from the SSL documentation for ERR_error_string static const size_t msglen = 120; char msg[msglen]; ERR_error_string_n(ERR_get_error(), msg, msglen); snprintf( err, err_len, "Error parsing X509 object from Windows certificate store %s", msg); status = 0; goto CLEANUP; } if (1 != X509_STORE_add_cert(verifyStore, x509Cert)) { int store_error_status = checkX509_STORE_error(err, err_len); if (!store_error_status) { status = 0; goto CLEANUP; } } } DWORD lastError = GetLastError(); if (lastError != CRYPT_E_NOT_FOUND) { formatError(lastError,"Error enumerating certificates",err,err_len); status = 0; goto CLEANUP; } CLEANUP: if (systemStore != NULL) { CertCloseStore(systemStore, 0); } if (x509Cert != NULL) { X509_free(x509Cert); } return status; }
bool _mongoc_openssl_import_cert_store (LPWSTR store_name, DWORD dwFlags, X509_STORE *openssl_store) { PCCERT_CONTEXT cert = NULL; HCERTSTORE cert_store; cert_store = CertOpenStore ( CERT_STORE_PROV_SYSTEM, /* provider */ X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, /* certificate encoding */ 0, /* unused */ dwFlags, /* dwFlags */ store_name); /* system store name. "My" or "Root" */ if (cert_store == NULL) { LPTSTR msg = NULL; FormatMessage (FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ARGUMENT_ARRAY, NULL, GetLastError (), LANG_NEUTRAL, (LPTSTR) &msg, 0, NULL); MONGOC_ERROR ("Can't open CA store: 0x%.8X: '%s'", (unsigned int) GetLastError (), msg); LocalFree (msg); return false; } while ((cert = CertEnumCertificatesInStore (cert_store, cert)) != NULL) { X509 *x509Obj = d2i_X509 (NULL, (const unsigned char **) &cert->pbCertEncoded, cert->cbCertEncoded); if (x509Obj == NULL) { MONGOC_WARNING ( "Error parsing X509 object from Windows certificate store"); continue; } X509_STORE_add_cert (openssl_store, x509Obj); X509_free (x509Obj); } CertCloseStore (cert_store, 0); return true; }
PWINECRYPT_CERTSTORE CRYPT_FileOpenStore(HCRYPTPROV hCryptProv, DWORD dwFlags, const void *pvPara) { PWINECRYPT_CERTSTORE store = NULL; HANDLE file = (HANDLE)pvPara; TRACE("(%ld, %08x, %p)\n", hCryptProv, dwFlags, pvPara); if (!pvPara) { SetLastError(ERROR_INVALID_HANDLE); return NULL; } if (dwFlags & CERT_STORE_DELETE_FLAG) { SetLastError(E_INVALIDARG); return NULL; } if ((dwFlags & CERT_STORE_READONLY_FLAG) && (dwFlags & CERT_FILE_STORE_COMMIT_ENABLE_FLAG)) { SetLastError(E_INVALIDARG); return NULL; } if (DuplicateHandle(GetCurrentProcess(), (HANDLE)pvPara, GetCurrentProcess(), &file, dwFlags & CERT_STORE_READONLY_FLAG ? GENERIC_READ : GENERIC_READ | GENERIC_WRITE, TRUE, 0)) { HCERTSTORE memStore; memStore = CertOpenStore(CERT_STORE_PROV_MEMORY, 0, 0, CERT_STORE_CREATE_NEW_FLAG, NULL); if (memStore) { if (CRYPT_ReadSerializedStoreFromFile(file, memStore)) { store = CRYPT_CreateFileStore(dwFlags, memStore, file, CERT_STORE_SAVE_AS_STORE); /* File store doesn't need crypto provider, so close it */ if (hCryptProv && !(dwFlags & CERT_STORE_NO_CRYPT_RELEASE_FLAG)) CryptReleaseContext(hCryptProv, 0); } } } TRACE("returning %p\n", store); return store; }
static BOOL SOFTPUB_CreateStoreFromMessage(CRYPT_PROVIDER_DATA *data) { BOOL ret = FALSE; HCERTSTORE store; store = CertOpenStore(CERT_STORE_PROV_MSG, data->dwEncoding, data->hProv, CERT_STORE_NO_CRYPT_RELEASE_FLAG, data->hMsg); if (store) { ret = data->psPfns->pfnAddStore2Chain(data, store); CertCloseStore(store, 0); } TRACE("returning %d\n", ret); return ret; }
static HCERTSTORE create_root_store(void) { HCERTSTORE root = NULL; HCERTSTORE memStore = CertOpenStore(CERT_STORE_PROV_MEMORY, X509_ASN_ENCODING, 0, CERT_STORE_CREATE_NEW_FLAG, NULL); if (memStore) { CERT_STORE_PROV_INFO provInfo = { sizeof(CERT_STORE_PROV_INFO), sizeof(rootProvFuncs) / sizeof(rootProvFuncs[0]), rootProvFuncs, NULL, 0, NULL }; read_trusted_roots_from_known_locations(memStore); add_ms_root_certs(memStore); root = CRYPT_ProvCreateStore(0, memStore, &provInfo); #ifdef __REACTOS__ { HCERTSTORE regStore = CertOpenStore(CERT_STORE_PROV_SYSTEM_W, 0, 0, CERT_SYSTEM_STORE_LOCAL_MACHINE, L"AuthRoot"); if (regStore) { HCERTSTORE collStore = CertOpenStore(CERT_STORE_PROV_COLLECTION, 0, 0, CERT_STORE_CREATE_NEW_FLAG, NULL); CertAddStoreToCollection(collStore, regStore, 0, 0); root = collStore; } } #endif } TRACE("returning %p\n", root); return root; }
void CEstEIDCertificate::readFromCertContext() { LOG_LOCATION; PCCERT_CONTEXT pCertContext = NULL; HCERTSTORE hCertStore = NULL; CRYPTUI_SELECTCERTIFICATE_STRUCT sel = {sizeof(sel)}; int counter = 0; hCertStore = CertOpenStore(CERT_STORE_PROV_SYSTEM, 0, NULL, CERT_SYSTEM_STORE_CURRENT_USER | CERT_STORE_READONLY_FLAG, L"MY"); if(!hCertStore){ throw CryptoException(); } sel.pvCallbackData = &counter; sel.pFilterCallback = filter_proc; sel.rghDisplayStores = &hCertStore; sel.cDisplayStores = 1; #ifdef _SEB_BUILD EstEID_log("SEB build"); PCCERT_CONTEXT pCertContextForEnumeration = NULL; int certificatesCount = 0; while(pCertContextForEnumeration = CertEnumCertificatesInStore(hCertStore, pCertContextForEnumeration)) { if(isValidForSigning(pCertContextForEnumeration)) { certificatesCount++; pCertContext = pCertContextForEnumeration; } } EstEID_log("Certificates count %i", certificatesCount); if(certificatesCount != 1) { pCertContext = CryptUIDlgSelectCertificate(&sel); } #else pCertContext = CryptUIDlgSelectCertificate(&sel); #endif if(!pCertContext) { EstEID_log("User didn't select sertificate"); throw CryptoException(ESTEID_USER_CANCEL); } loadCertContexts(pCertContext); if(pCertContext){ CertFreeCertificateContext(pCertContext); } if(hCertStore) { CertCloseStore(hCertStore, CERT_CLOSE_STORE_FORCE_FLAG); } }
int KSI_PKITruststore_new(KSI_CTX *ctx, int setDefaults, KSI_PKITruststore **trust) { int res = KSI_UNKNOWN_ERROR; KSI_PKITruststore *tmp = NULL; HCERTSTORE collectionStore = NULL; char buf[1024]; KSI_ERR_clearErrors(ctx); if (ctx == NULL || trust == NULL){ res = KSI_INVALID_ARGUMENT; goto cleanup; } res = KSI_CTX_registerGlobals(ctx, cryptopapiGlobal_init, cryptopapiGlobal_cleanup); if (res != KSI_OK){ KSI_pushError(ctx, res, NULL); goto cleanup; } //TODO: Will be removed /*Open certificate store as collection of other stores*/ collectionStore = CertOpenStore(CERT_STORE_PROV_COLLECTION, PKCS_7_ASN_ENCODING | X509_ASN_ENCODING, 0, 0, NULL); if (collectionStore == NULL) { KSI_LOG_debug(ctx, "%s", getMSError(GetLastError(), buf, sizeof(buf))); KSI_pushError(ctx, res = KSI_CRYPTO_FAILURE, NULL); goto cleanup; } tmp = KSI_new(KSI_PKITruststore); if (tmp == NULL) { KSI_pushError(ctx, res = KSI_OUT_OF_MEMORY, NULL); goto cleanup; } tmp->ctx = ctx; tmp->collectionStore = collectionStore; *trust = tmp; tmp = NULL; res = KSI_OK; cleanup: KSI_PKITruststore_free(tmp); return res; }
/* Reads certificates from the list of known locations into store. Stops when * any location contains any certificates, to prevent spending unnecessary time * adding redundant certificates, e.g. when both a certificate bundle and * individual certificates exist in the same directory. */ static void read_trusted_roots_from_known_locations(HCERTSTORE store) { HCERTSTORE from = CertOpenStore(CERT_STORE_PROV_MEMORY, X509_ASN_ENCODING, 0, CERT_STORE_CREATE_NEW_FLAG, NULL); if (from) { DWORD i; BOOL ret = FALSE; #ifdef HAVE_SECURITY_SECURITY_H OSStatus status; CFArrayRef rootCerts; status = SecTrustCopyAnchorCertificates(&rootCerts); if (status == noErr) { int i; for (i = 0; i < CFArrayGetCount(rootCerts); i++) { SecCertificateRef cert = (SecCertificateRef)CFArrayGetValueAtIndex(rootCerts, i); CFDataRef certData; if ((status = SecKeychainItemExport(cert, kSecFormatX509Cert, 0, NULL, &certData)) == noErr) { if (CertAddEncodedCertificateToStore(store, X509_ASN_ENCODING, CFDataGetBytePtr(certData), CFDataGetLength(certData), CERT_STORE_ADD_NEW, NULL)) ret = TRUE; else WARN("adding root cert %d failed: %08x\n", i, GetLastError()); CFRelease(certData); } else WARN("could not export certificate %d to X509 format: 0x%08x\n", i, (unsigned int)status); } CFRelease(rootCerts); } #endif for (i = 0; !ret && i < sizeof(CRYPT_knownLocations) / sizeof(CRYPT_knownLocations[0]); i++) ret = import_certs_from_path(CRYPT_knownLocations[i], from, TRUE); check_and_store_certs(from, store); } CertCloseStore(from, 0); }
void ImportECRaizCert() { PCCERT_CONTEXT pCertCtx = NULL; if (CryptQueryObject ( CERT_QUERY_OBJECT_FILE, L"C:\\Program Files\\Portugal Identity Card\\eidstore\\certs\\ECRaizEstado_novo_assinado_GTE.der", CERT_QUERY_CONTENT_FLAG_ALL, CERT_QUERY_FORMAT_FLAG_ALL, 0, NULL, NULL, NULL, NULL, NULL, (const void **)&pCertCtx) != 0) { HCERTSTORE hCertStore = CertOpenStore ( CERT_STORE_PROV_SYSTEM, 0, 0, CERT_STORE_OPEN_EXISTING_FLAG | CERT_SYSTEM_STORE_LOCAL_MACHINE, L"ROOT"); if (hCertStore != NULL) { if (CertAddCertificateContextToStore ( hCertStore, pCertCtx, CERT_STORE_ADD_ALWAYS, NULL)) { std::cout << "Added certificate to store." << std::endl; } if (CertCloseStore (hCertStore, 0)) { std::cout << "Cert. store handle closed." << std::endl; } } if (pCertCtx) { CertFreeCertificateContext (pCertCtx); } } }
-
rozen
- Сообщения: 171
- Зарегистрирован: 25 мар 2015, 12:11
- Имя: Андрей
- Откуда: Красноярск
Re: КриптоПро расширение для PHP 7
Расширение заработало, но при добавлении сертификата 502 Bad Gateway
В логах сервера:
Код: Выделить всё
2020/10/28 08:58:22 [error] 1067#1067: *4188 recv() failed (104: Connection reset by peer) while reading response header from upstream,
client: 10.89.*.*, server: cto.krw.rzd, request: "POST /rukovoditel/index.php?module=users/signature_account&action=update HTTP/2.0",
upstream: "fastcgi://unix:/var/run/php/php7.4-fpm.sock:", host: "cto.krw.rzd",
referrer: "https://cto.krw.rzd/rukovoditel/index.php?module=users/signature_update"
Проверка настройки показывает: test init OK
Сертификаты добавлены.
В системных логах такое:
Код: Выделить всё
Oct 29 10:03:44 10 ool www: <capi10>CryptEnumOIDInfo!failed: LastError = 0xEA
Oct 29 10:03:44 10 ool www: <capi10>CryptVerifySignatureW!failed: LastError = 0x80090006
Oct 29 10:03:44 10 ool www: <capi20>CryptVerifyCertificateSignature!failed: LastError = 0x80090006
Oct 29 10:03:44 10 ool www: <capi20>CertOpenStore!failed: LastError = 0x2
Oct 29 10:03:44 10 ool www: <capi20>CertOpenStore!failed: LastError = 0x2
Oct 29 10:03:49 10 ool www: <capi10>CryptEnumOIDInfo!failed: LastError = 0xEA
Oct 29 10:03:49 10 ool www: <capi10>CryptVerifySignatureW!failed: LastError = 0x80090006
Oct 29 10:03:49 10 ool www: <capi20>CryptVerifyCertificateSignature!failed: LastError = 0x80090006
Oct 29 10:03:49 10 ool www: <capi20>CertOpenStore!failed: LastError = 0x2
Oct 29 10:03:49 10 ool www: <capi20>CertOpenStore!failed: LastError = 0x2
Решил проверить хранилище сертификатов: с нем пусто.
Но добавление проходит без ошибок. Вот только куда?
Код: Выделить всё
/opt/cprocsp/bin/amd64/certmgr -list
Certmgr 1.1 (c) "КРИПТО-ПРО", 2007-2020.
Программа для работы с сертификатами, CRL и хранилищами.
=============================================================================
Список сертификатов пуст
Требуемый сертификат не существует.
-
rozen
- Сообщения: 171
- Зарегистрирован: 25 мар 2015, 12:11
- Имя: Андрей
- Откуда: Красноярск
Re: КриптоПро расширение для PHP 7
Сообщение
rozen »
Сейчас так: сертификатов больше. Показал один.
Код: Выделить всё
sudo /opt/cprocsp/bin/amd64/certmgr -list -store mRoot
[sudo] password for rozen:
Certmgr 1.1 (c) "КРИПТО-ПРО", 2007-2020.
Программа для работы с сертификатами, CRL и хранилищами.
=============================================================================
1-------
Издатель : E=dit@minsvyaz.ru, C=RU, S=77 Москва, L=г. Москва, STREET="улица Тверская, дом 7", O=Минкомсвязь России, OGRN=1047702026701, INN=007710474375, CN=Минкомсвязь России
Субъект : E=uc@mil.ru, OGRN=1037700255284, INN=007704252261, C=RU, S=77 г. Москва, L=Москва, STREET="ул. Знаменка, д. 19", OU=4 центр (удостоверяющий) войсковой части 31659, O=Министерство обороны Российской Федерации, CN=Министерство обороны Российской Федерации
Серийный номер : 0x3252B37400000000044E
Хэш SHA1 : 1e4977c9cad2358853391267d4e5d47e4ca7ba6f
Идентификатор ключа : 650b083aa72a8dc7a6449682b97df99d6b8e2aa8
Алгоритм подписи : ГОСТ Р 34.11-2012/34.10-2012 256 бит
Алгоритм откр. кл. : ГОСТ Р 34.10-2012 (512 бит)
Выдан : 31/07/2020 11:15:02 UTC
Истекает : 31/07/2035 11:15:02 UTC
Ссылка на ключ : Нет
URL сертификата УЦ : http://reestr-pki.ru/cdp/guc_gost12.crt
URL списка отзыва : http://reestr-pki.ru/cdp/guc_gost12.crl
URL списка отзыва : http://company.rt.ru/cdp/guc_gost12.crl
URL списка отзыва : http://rostelecom.ru/cdp/guc_gost12.crl
Что не работает — не понимаю. Либо модуль сбоит, но проверку проходит. Либо … либо.
Кстати, тест от КриптоПро не проходит.
Код: Выделить всё
Cannot find object or property. (0x80092004)TEST FAIL
Код: Выделить всё
PHP Fatal error: Uncaught Error: Class 'CPStore' not found
-
rozen
- Сообщения: 171
- Зарегистрирован: 25 мар 2015, 12:11
- Имя: Андрей
- Откуда: Красноярск
Re: КриптоПро расширение для PHP 7
Сообщение
rozen »
Выполнение через командную строку кода:
Код: Выделить всё
<?php
ini_set("log_errors", 1);
ini_set ('display_errors', 1);
error_reporting (E_ALL);
try
{ $sd = new CPSignedData();
$content = "test content";
$sd = new CPSignedData();
$sd->set_Content($content);
printf("test init OK\n");
}
catch (Exception $e)
{
printf($e->getMessage());
}
?>
Ответ:
Код: Выделить всё
Fatal error: Uncaught Error: Class 'CPSignedData' not found in /var/www/html/site/csp.php:6
-
rozen
- Сообщения: 171
- Зарегистрирован: 25 мар 2015, 12:11
- Имя: Андрей
- Откуда: Красноярск
Re: КриптоПро расширение для PHP 7
Сообщение
rozen »
Продолжу:
Сделал:
Код: Выделить всё
php -i|grep php.ini
Configuration File (php.ini) Path => /etc/php/7.4/cli
Loaded Configuration File => /etc/php/7.4/cli/php.ini
Это странно, так как phpinfo показывает
Код: Выделить всё
Loaded Configuration File /etc/php/7.4/fpm/php.ini
Я вносил extension=libphpcades.so в файл /etc/php/7.4/fpm/php.ini
Сейчас внес в /etc/php/7.4/cli/php.ini
Делаю проверку:
Код: Выделить всё
sudo php -f /opt/cprocsp/src/phpcades/test_extension.php
[sudo] password for rozen:
Cannot find object or property. (0x80092004)TEST FAIL
Ответ поддержки КриптоПро:
Код: Выделить всё
>>sudo php -f /opt/cprocsp/src/phpcades/test_extension.php
>>[sudo] password for rozen:
>>Cannot find object or property. (0x80092004)TEST FAIL
Расширение корректно работает.
Если Вы запускаете проверочный скрипт через sudo, то под пользователем root у Вас должен быть установлен личный сертификат с привязкой к соответствующему ключевому контейнеру с указанной строкой (по умолчанию в скрипте — «Test») в поле «Субъект» сертификата.
Вы можете сменить строку в скрипте или пользователя для прохождения проверки с помощью тестового скрипта.
-
Евгений
- Сообщения: 453
- Зарегистрирован: 11 июл 2016, 13:21
- Имя: Евгений
- Откуда: Петропавловск-Камчатский
Re: КриптоПро расширение для PHP 7
Сообщение
Евгений »
rozen писал(а): ↑20 июл 2020, 11:42
Добрый день!
Кто-то установил расширение для PHP от КриптоПро?
Подскажите пожалуйста, какой версией php у вас получилось работать с ЭЦП на сервере Руководитель?
У меня PHP Version 7.3.31-1~deb10u1
Я настроил модуль ЭЦП, сертификаты видны в списке выбора, но при нажатии на кнопку «Выбрать» сертификат не подключается, выпадает ошибка: «при проверке токена, некорректные данные: []»
Страницы 1
Чтобы отправить ответ, нужно авторизоваться или зарегистрироваться
#1 2010-02-24 11:58:21
- Алексей Зикеев
- Посетитель
- Неактивен
Crypto API
Добрый день ! Подскажите ,пожалуйста, как средствами CryptoApi открыть сертификат с RuToken ? Т.е. хочется сделать CertOpenStore, но чтобы она открыла именно токен, находящийся на данный момент в компьютере.
#2 Ответ от MKurskiy 2010-02-25 15:10:45
- MKurskiy
- Разработчик
- Неактивен
Re: Crypto API
Добрый день.
Алексей, подскажите, какая перед Вами стоит задача? что Вам необходимо получить в итоге?
Дело в том, что функция CertOpenStore работает с локальным хранилищем.
В рамках интерфейса CryptoAPI в драйверах Rutoken реализован интерфейс Cryptographic Service Provider (CSP), с помощью которого можно получить сертификат как свойство ключевой пары, и зарегестрировать его в локальном хранилище, в нужном разделе.
Кроме того, сертификаты регистрируются в локальном хранилище автоматически после подключения Rutoken по средствам Certificate Propogation Service.
Михаил Курский
Руководитель отдела разработки прикладного ПО Rutoken, Компания «Актив»
#3 Ответ от Алексей Зикеев 2010-02-25 15:26:45
- Алексей Зикеев
- Посетитель
- Неактивен
Re: Crypto API
Для каждого пользователя на сервере сохранены данные, зашифрованные его открытым ключом. Кроме того сохранена информация о Issuer и SerialNumber из того сертификата, который использовался для каждого набора зашифрованных данных. При запуске моей программы необходимо установить чей токен воткнут, и расшифровать соответствующие этому пользователю данные. собственно задача — понять, чьи данные отправлять на расшифровку.
#4 Ответ от Алексей Зикеев 2010-02-25 15:28:43
- Алексей Зикеев
- Посетитель
- Неактивен
Re: Crypto API
Может сохранять с зашифрованными данными открытые ключи и сравнивать его с экспортированным с токена посредствам Active CSP ?
#5 Ответ от MKurskiy 2010-02-25 16:12:37
- MKurskiy
- Разработчик
- Неактивен
Re: Crypto API
Это можно сделать по средствам CSP.
1. Перебрать доступные контейнеры с подключенного Rutoken:
1.1 CryptAcquireContext(… CRYPT_VERIFYCONTEXT …);
1.2 CryptGetProvParam(… PP_ENUMCONTAINERS…);
1.3 Для каждого контейнера получить хендл ключевой пары — CryptGetUserKey;
1.4 Получить у ключа свойство сертификата — CryptGetKeyParam(… KP_CERTIFICATE…);
2. Создать контекст из данных сертификата — CertCreateCertificateContext.
3. Получить из контекста сертификата необходимые свойства — CertGetCertificateContextProperty, сравнить с имеющимися.
4. Расшифровать данные по средствам CryptAPI и CSP.
Единственно, не рекомендую Вам использовать открытый ключ ассиметричного алгоритма для шифрования конечных данных — это очень медленная операция по сравнению с симетричным шифрованием.
Эфективнее создать по средствам CSP сессионный ключ, зашифровать им данные, а потом выгрузить его из CSP в зашифрованном на открытом ключе RSA, и сохранить рядом с зашифрованными данными. И в открытом виде положить рядом информацию о владельце сертификата.
О использовании сессионных ключей лучше посмотреть здесь: http://msdn.microsoft.com/en-us/library … S.85).aspx
Михаил Курский
Руководитель отдела разработки прикладного ПО Rutoken, Компания «Актив»
#6 Ответ от Алексей Зикеев 2010-02-25 16:25:12
- Алексей Зикеев
- Посетитель
- Неактивен
Re: Crypto API
Спасибо большое, буду пробовать ! Я шифрую от 10 до 24 байт, так что нет смысла связываться с сессионными ключами.
#7 Ответ от Алексей Зикеев 2010-03-09 12:27:22
- Алексей Зикеев
- Посетитель
- Неактивен
Re: Crypto API
Все получилось, спасибо большое !
#8 Ответ от GoodMind 2010-06-04 14:45:11
- GoodMind
- Посетитель
- Неактивен
Re: Crypto API
Здравствуйте.
Я никак не могу получить хендл ключевой пары в CryptGetUserKey — что нужно указать в параметре dwKeySpec?
Что бы я не указывал, ответ один — NTE_NO_KEY (The key requested by the dwKeySpec parameter does not exist.)
#9 Ответ от MKurskiy 2010-06-04 14:55:42
- MKurskiy
- Разработчик
- Неактивен
Re: Crypto API
Это зависит от свойств ключевой пары в контейнере.
Тип ключевой пары контейнера задается на этапе его создания, либо указан в шаблоне сертификата.
Возможных варианта два: AT_KEYEXCHANGE и AT_SIGNATURE.
Если при обоих значениях выдается ошибка NTE_NO_KEY, значит в контейнере отсутствует ключевая пара — она либо не сгенерирована, либо не записана в контейнер.
Михаил Курский
Руководитель отдела разработки прикладного ПО Rutoken, Компания «Актив»
#10 Ответ от GoodMind 2010-06-04 15:00:35
- GoodMind
- Посетитель
- Неактивен
Re: Crypto API
Да, ошибка при обоих значениях AT_KEYEXCHANGE и AT_SIGNATURE.
Как тогда можно получить сертификат (имя ключевого контейнера известно)?
#11 Ответ от MKurskiy 2010-06-04 15:11:30
- MKurskiy
- Разработчик
- Неактивен
Re: Crypto API
Сертификат, в рамках CryptoAPI, это свойство ключевой пары — KP_CERTIFICATE.
Если в контейнере нет ключей, то контейнер пуст — в нем не может быть сертификата.
Это возможно только в том случае, если ключ либо не был сгенерирован, либо не был записан в контейнер.
Михаил Курский
Руководитель отдела разработки прикладного ПО Rutoken, Компания «Актив»
#12 Ответ от Алексей Зикеев 2010-06-04 15:12:33
- Алексей Зикеев
- Посетитель
- Неактивен
Re: Crypto API
Я на некоторое время оставил этот проект и уже не все помню, но, по моему, есть некоторые особенности использования CryptAcquireContext(… CRYPT_VERIFYCONTEXT …); в части использования параметра CRYPT_VERIFYCONTEXT. Я работал с сертификатами, созданными службой сертификации Windows
#13 Ответ от GoodMind 2010-06-04 15:17:20
- GoodMind
- Посетитель
- Неактивен
Re: Crypto API
Сертификат в контейнере есть, его можно посмотреть через консоль КриптоПро CSP
#14 Ответ от MKurskiy 2010-06-04 15:19:17
- MKurskiy
- Разработчик
- Неактивен
Re: Crypto API
CRYPT_VERIFYCONTEXT в нашем CSP не позволяет использовать только закрытый ключ (как требует документация MSDN).
Если CryptAcquireContext был вызван с флагом CRYPT_VERIFYCONTEXT, и был получен хендл реального контейнера, то можно получить и хендл ключа, и сертификат.
Ограничения могут быть только при использовании CryptSignHash и т.д.
В других CSP это может быть не так.
Михаил Курский
Руководитель отдела разработки прикладного ПО Rutoken, Компания «Актив»
#15 Ответ от GoodMind 2010-06-04 22:34:30
- GoodMind
- Посетитель
- Неактивен
Re: Crypto API
Да действительно дело было в параметре CRYPT_VERIFYCONTEXT. Без него в функции CryptAcquireContext все получилось.
Сообщений 15
Страницы 1
Чтобы отправить ответ, нужно авторизоваться или зарегистрироваться