| ||||
| ||||
Пытаюсь написать приложение на C++ реализующее TLS но не могу избавиться от ошибки SEC_E_INTERNAL_ERROR в функции AcquireCredentialsHandle Код следующий: #define UNISP_NAME_MY "CryptoPro SSP" ... static DWORDCreateCredentials(LPSTR pszUserName, PCredHandle phCreds) { SCHANNEL_CRED SchannelCred; TimeStamp tsExpiry; SECURITY_STATUS Status; PCCERT_CONTEXT pCertContext = NULL; if(pszUserName == NULL ||strlen(pszUserName) == 0) { printf("**** No user name specified!\n"); return (DWORD)SEC_E_NO_CREDENTIALS; } // Open the "MY" certificate store. hMyCertStore =CertOpenStore(CERT_STORE_PROV_SYSTEM, 0, 0, CERT_STORE_OPEN_EXISTING_FLAG|CERT_STORE_READONLY_FLAG|CERT_SYSTEM_STORE_CURRENT_USER, L"MY" ); if(!hMyCertStore) { printf("**** Error 0x%x returned by CertOpenSystemStore\n", GetLastError()); return (DWORD)SEC_E_NO_CREDENTIALS; } pCertContext = CertFindCertificateInStore(hMyCertStore, X509_ASN_ENCODING, 0, CERT_FIND_SUBJECT_STR_A, pszUserName, NULL); if(pCertContext == NULL) { printf("**** Error 0x%x returned by CertFindCertificateInStore\n", GetLastError()); return (DWORD)SEC_E_NO_CREDENTIALS; } ZeroMemory(&SchannelCred, sizeof(SchannelCred)); SchannelCred.dwVersion = SCHANNEL_CRED_VERSION; SchannelCred.cCreds = 1; SchannelCred.paCred = &pCertContext; SchannelCred.grbitEnabledProtocols = dwProtocol; Status = g_SecurityFunc.AcquireCredentialsHandle( NULL, // Name of principal UNISP_NAME_MY, // Name of package SECPKG_CRED_INBOUND, // Flags indicating use NULL, // Pointer to logon ID &SchannelCred, // Package specific data NULL, // Pointer to GetKey() func NULL, // Value to pass to GetKey() phCreds, // (out) Cred Handle &tsExpiry); // (out) Lifetime (optional) if(Status != SEC_E_OK) { printf("**** Error 0x%x returned by AcquireCredentialsHandle\n", Status); goto err; } В этом месте ф-ция AcquireCredentialsHandle всегда выдает ошибку SEC_E_INTERNAL_ERROR. Как мне это побороть? В чем может быть ошибка? PS Не могли бы вы дать ссылку на РАБОТАЮЩИЙ пример использования CryptoPro TLS в клиентском и серверном приложении. | ||||
Ответы: | ||||
| ||||
По техническим причинам EnumerateSecurityPackages выдаёт среди прочих "CryptoPro SSP", однако выбирать всегда нужно "Microsoft Unified Security Protocol Provider": #define UNISP_NAME_MY "Microsoft Unified Security Protocol Provider" Ряд рабочих примеров выложены на нашем сайте: http://www.cryptopro.ru/CryptoPro/products/csp4.asp Для скачивания непосредственно: http://www.cryptopro.ru/CryptoPro/test/csptest2_0.exe | ||||