06.10.2004 11:36:44CryptoPro TLS Ответов: 1
Боярченко Алексей
Пытаюсь написать приложение на 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 в клиентском и серверном приложении.
 
Ответы:
06.10.2004 16:25:40Olin
По техническим причинам 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