13.03.2002 14:16:49xenroll и CryptoPro Ответов: 1
Алексей
Насколько я понял xenroll сама запускает
CPGenKey провайдера CryptoPro, генерит
ключевую пару в данном случае обмена, записывает
ее на ключевой контейнер (дискету в случае CryptoPro) и создает запрос сертификата PKCS10.
Все это происходит при вызове createPKCS10

Перевел Ваш пример на С++
При createPKCS10 получаю ошибку 80090019
- ключевой набор не установлен
Какие то параметры xenroll я не установил?
В какое значение надо устанавливать HashAlgorithm?
Почему выбирается именно такой OID =1.3.6.1.5.5.7.3.2?

BSTR bstrreq=NULL;
ICEnroll * pEnroll = NULL;

// variable for return value
HRESULT hr;

// Initialize COM.
hr = CoInitializeEx( NULL, COINIT_APARTMENTTHREADED );

// Check status.
if ( FAILED( hr ) )
{
sprintf(str1,"Failed CoInitializeEx - [%x]", hr);
MessageBox(NULL,str1,"qq",MB_OK|MB_TASKMODAL);
goto error;
}

// Create an instance of the object.
hr = CoCreateInstance( CLSID_CEnroll,
NULL,
CLSCTX_INPROC_SERVER,
IID_ICEnroll,
(void **)&pEnroll);

// Check status.
if ( FAILED( hr ) )
{
sprintf(str1,"Failed CoCreateInstance - pEnroll [%x]", hr);
MessageBox(NULL,str1,"qq",MB_OK|MB_TASKMODAL);
goto error;
}
else
{
// Successfully instantiated object.
sprintf(str1,"Obtained pointer to Enrollment interface");
MessageBox(NULL,str1,"qq",MB_OK|MB_TASKMODAL);
// Use object as needed.
// ...
}

hr = pEnroll->put_ProviderName((wchar_t*)"Crypto-Pro Cryptographic Service Provider");
if (FAILED( hr ))
{
sprintf(str1,"Failed put_ProviderName - %x", hr );
MessageBox(NULL,str1,"qq",MB_OK|MB_TASKMODAL);
goto error;
}
else
{
sprintf(str1,"ProviderName set");
MessageBox(NULL,str1,"qq",MB_OK|MB_TASKMODAL);
}

hr = pEnroll->put_KeySpec( AT_KEYEXCHANGE );
if (FAILED( hr ))
{
sprintf(str1,"Failed put_KeySpec - %x", hr );
MessageBox(NULL,str1,"qq",MB_OK|MB_TASKMODAL);
goto error;
}
else
{
sprintf(str1,"KeySpec set to %d", AT_KEYEXCHANGE );
MessageBox(NULL,str1,"qq",MB_OK|MB_TASKMODAL);
}

hr = pEnroll->put_ProviderType(2);
if (FAILED(hr))
{
sprintf(str1,"Failed put_ProviderType - %x", hr);
MessageBox(NULL,str1,"qq",MB_OK|MB_TASKMODAL);
goto error;
}
else
{
sprintf(str1,"ProviderType set");
MessageBox(NULL,str1,"qq",MB_OK|MB_TASKMODAL);
}

strcpy(str1,"CN=Your Name,OU=Your Unit,O=Your Org,L=Redmond,S=Washington,C=US");
hr=pEnroll->createPKCS10((wchar_t*)str1,(wchar_t*)"1.3.6.1.5.5.7.3.2",&bstrreq);
if (FAILED(hr))
{
sprintf(str1,"Failed createPKCS10 - %x", hr);
MessageBox(NULL,str1,"qq",MB_OK|MB_TASKMODAL);
goto error;
}
else
{
// Success.
sprintf(str1,"Successfully created file containing PKCS10");
MessageBox(NULL,str1,"qq",MB_OK|MB_TASKMODAL);
}

error:

// Done processing.
// Clean up resources.
if ( NULL != pEnroll )
pEnroll->Release();

// Free COM resources.
CoUninitialize();

//return hr;
 
Ответы:
13.03.2002 14:41:00kure
А вы уверены, что
strcpy(str1,"CN=Your Name,OU=Your Unit,O=Your Org,L=Redmond,S=Washington,C=US");
hr=pEnroll->createPKCS10((wchar_t*)str1,(wchar_t*)"1.3.6.1.5.5.7.3.2",&bstrreq);

преобразование char* к wchar_t* в результате даст unicode строку.

Вот пример из MSDN
bstrDN = SysAllocString( TEXT("CN=Your Name") // common name
TEXT(",OU=Your Unit") // org unit
TEXT(",O=Your Org") // organization
TEXT(",L=Redmond") // locality
TEXT(",S=Washington") // state
TEXT(",C=US") ); // country/region