Статус: Активный участник
Группы: Участники
Зарегистрирован: 27.04.2012(UTC) Сообщений: 119 Откуда: Digital Design Сказал «Спасибо»: 19 раз Поблагодарили: 1 раз в 1 постах
|
Здравствуйте. Во время работы в фоне на заблокированном устройстве с паролем получаю ошибку как в теме из раздела "КриптоПро 3.0": https://www.cryptopro.ru....aspx?g=posts&t=1610Там человек спрашивал про винду, но код точно такой же и ошибка такая же. При вызове AcquireCredentialsHandle получаю ошибку SEC_E_INTERNAL_ERROR. При чем только когда устройство защищено паролем и заблокировано. Использую последнюю сертифицированную версию КриптоПро 3.9 (требование Заказчика, у них эта версия закуплена). Может, кто подскажет, в чем может быть проблема? Просто этому коду сто лет в обед и он всегда работал, а тут такая беда.
Код:
- (PCCERT_CONTEXT)pcCertContext {
if (!_pcCertContext) {
const char *comonName = self.subject.UTF8String;
HCERTSTORE myStore = openStoreOrCreateIt(myStoreName);
if (myStore) {
PCCERT_CONTEXT pUserCert = CertFindCertificateInStore(myStore, MY_ENCODING_TYPE, 0, CERT_FIND_SUBJECT_STR, _TEXT(comonName), NULL);
if (!pUserCert) {
//ищем в CA
myStore = openStoreOrCreateIt(caStoreName);
pUserCert = CertFindCertificateInStore(myStore, MY_ENCODING_TYPE, 0, CERT_FIND_SUBJECT_STR, _TEXT(comonName), NULL);
CertCloseStore(myStore, 0);
}
if (!pUserCert) {
//ищем в root
myStore = openStoreOrCreateIt(rootStoreName);
pUserCert = CertFindCertificateInStore(myStore, MY_ENCODING_TYPE, 0, CERT_FIND_SUBJECT_STR, _TEXT(comonName), NULL);
CertCloseStore(myStore, 0);
}
CertCloseStore(myStore, 0);
_pcCertContext = pUserCert;
}
else {
DDLogErrorWithModule(EWModuleTypeCrypto, @"error 0x%x", CSP_GetLastError());
_pcCertContext = NULL;
}
}
return _pcCertContext;
}
// Функция создания мандатов.
SECURITY_STATUS CreateCredentials()
{
TimeStamp tsExpiry;
SECURITY_STATUS Status;
DWORD cSupportedAlgs = 0;
ALG_ID rgbSupportedAlgs[16];
PCCERT_CONTEXT pCertContext = NULL;
if (useCleintCertificateAuthentication) {
GostCertificate *cert = (GostCertificate *) [PkiFactory factoryWithType:PkiFactoryTypeDigitalSign].certificate;
pCertContext = cert.pcCertContext;
}
ZeroMemory(&SchannelCred, sizeof(SchannelCred));
SchannelCred.dwVersion = SCHANNEL_CRED_VERSION;
if (pCertContext) {
SchannelCred.cCreds = 1;
SchannelCred.paCred = &pCertContext;
}
else {
DDLogErrorWithModule(EWModuleTypeCrypto, @"**** Error 0x%x returned, empty pCertContext\n ", CSP_GetLastError());
}
SchannelCred.grbitEnabledProtocols = dwProtocol;
if (cSupportedAlgs) {
SchannelCred.cSupportedAlgs = cSupportedAlgs;
SchannelCred.palgSupportedAlgs = rgbSupportedAlgs;
}
SchannelCred.dwFlags |= SCH_CRED_MANUAL_CRED_VALIDATION;
SchannelCred.dwFlags |= SCH_CRED_NO_DEFAULT_CREDS;
//
// Создание SSPI мандата.
//
Status = g_pSSPI->AcquireCredentialsHandleA(NULL, // Name of principal
(SEC_CHAR *) UNISP_NAME_W1, // Name of package
SECPKG_CRED_OUTBOUND, // Flags indicating use
NULL, // Pointer to logon ID
&SchannelCred, // Package specific data
NULL, // Pointer to GetKey() func
NULL, // Value to pass to GetKey()
&_hClientCreds, // (out) Cred Handle
&tsExpiry); // (out) Lifetime (optional)
if (Status != SEC_E_OK) {
DDLogErrorWithModule(EWModuleTypeCrypto, @"**** Error 0x%x returned by AcquireCredentialsHandle\n ", Status);
}
credentialsCreated = Status == SEC_E_OK;
return Status;
} //CreateCredentials
Отредактировано пользователем 19 июля 2017 г. 22:57:15(UTC)
| Причина: Не указана |
ВАСИЛИЙ АНИСИМОВ Ведущий iOS разработчик в «Digital Design» www.digdes.ru |