| ||||
| ||||
Насколько я понял 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; | ||||
Ответы: | ||||
| ||||
А вы уверены, что 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 | ||||