Автор: int_el Всем доброго времени суток!
У меня такая же проблема - не могу получить корневой сертификат через CryptoAPI на iOS.
Код простейший:
Код:
UnixRequest * request = UnixRequest::URFactory("CPCA15");
HRESULT res;
BSTR bstrConfig = SysAllocString(L"https://cryptopro.ru:5555/ui");
BSTR bstrCACert;
res = request->GetCACertificate(false, bstrConfig, CR_OUT_BASE64HEADER|CR_OUT_CHAIN, &bstrCACert);
if (res == S_OK)
{
printf("Got CA Certificate: ");
printf("%s",ConvertBSTRToString(bstrCACert));
printf("\n");
}
else
{
handleError("GetCACertificate");
}
Вот что выводит в консоли:
libssp: 0x3a721d4: :3915 AddToMessageLog CryptoPro TLS. Certificate status: 0x20
libssp: 0x3a721d4: :3922 AddToMessageLog CryptoPro TLS. Error 0x80090325 validating server's certificate: The certificate chain was issued by an authority that is not trusted.
An error occurred in the program.
GetCACertificate
Error number 80092004.
Пробовал различные варианты авторизации через SetCredential - не помогает.
Причем, если через панель КриптоПРО установить сертификат, то после этого код работает без проблем.
Подскажите, пожалуйста, как решить эту проблему.
Прошу прощения за поздний ответ, не хватает вызова SetCredential
static long getAndInstallCACert(const char* UIURL, long * pCertsInstalled)
{
LONG flags = CR_OUT_BASE64HEADER;
UnixRequest * pRequest = 0;
HRESULT res;
BSTR bstrCert = 0;
pRequest = UnixRequest::URFactory("CPCA15");
if (pRequest == 0)
return NTE_FAIL;
res = pRequest->SetCredential(NULL,X509AuthAnonymous,
X509EnrollmentCheckChainFlags(X509CC_TLS|X509CC_NoCheck),
NULL, NULL);
if(res != S_OK){
printf("SetCredential failed\n");
return res;
}
BSTR UrlOfCA = ConvertStringToBSTR(UIURL);
res = pRequest->GetCACertificate(0, UrlOfCA, flags, &bstrCert);
if(res != S_OK){
printf("GetCACertificate failed\n");
SysFreeString(UrlOfCA);
if(bstrCert) SysFreeString(bstrCert);
return res;
}
Callbacks tb;
UnixEnroll * pEnroll = new UnixEnroll(tb,true);
LONG lCertInstalled=0;
res = pEnroll->installPKCS7Ex(bstrCert,&lCertInstalled);
*pCertsInstalled = lCertInstalled;
SysFreeString(UrlOfCA);
if(bstrCert) SysFreeString(bstrCert);
delete pEnroll;
delete pRequest;
return res;
}
Пример вызова:
long plCertInstalled = 0;
std::string UIURL = "https://cryptopro.ru:5555/ui";
res = getAndInstallCACert(UIURL.c_str(), &plCertInstalled);
if ((res != S_OK) || (plCertInstalled == 0)) {
HandleError("Error getAndInstallCACert");
goto er;
}