Статус: Новичок
Группы: Участники
Зарегистрирован: 20.08.2021(UTC) Сообщений: 1 Откуда: Москва
|
Здравствуйте, использую в IOS приложении Крипто Про для авторизации по сертификату. Импортирую сертификат следующим образом: Цитата: - (NSString *)importCertFromPFXStore:(NSString *)filePath withCertPassword:(NSString *)certPassword withPassword:(NSString *)password { return [self performActionWithExceptionsHandling:^id { CleanUp(); if (![[NSFileManager defaultManager] fileExistsAtPath:filePath]) { return @(NO); } NSData *data = [NSData dataWithContentsOfFile:filePath]; CRYPT_DATA_BLOB blob; blob.cbData = [data length]; blob.pbData = (BYTE *)malloc([data length]); memcpy(blob.pbData, [data bytes], [data length]); if (!(hSystemStore = CertOpenStore(CERT_STORE_PROV_SYSTEM,0, NULL, CERT_SYSTEM_STORE_LOCAL_MACHINE, L"MY"))) { CleanUp(); [self handleException:WLI_CRYPTO_CERT_OPEN_STORE_EXCEPTION_REASON]; return nil; } else { NSLog(@"[%@] MY cert store opened.", NSStringFromSelector(_cmd)); } if (!(hCertStore = PFXImportCertStore(&blob, [self wcharFromString:certPassword], CRYPT_EXPORTABLE|CRYPT_SILENT))) { CleanUp(); [self handleException:WLI_CRYPTO_CERT_OPEN_STORE_EXCEPTION_REASON]; return nil; } else { NSLog(@"[%@] PFX store was opened.", NSStringFromSelector(_cmd)); } fprintf (stderr, "Acquire error 0x%08x \n", CSP_GetLastError()); pCertContext = NULL; int i=0; bool imported = false; while (0 != (pCertContext = CertEnumCertificatesInStore(hCertStore, pCertContext))) { if (!CertAddCertificateContextToStore(hSystemStore, pCertContext, CERT_STORE_ADD_REPLACE_EXISTING, NULL)) { CleanUp(); [self handleException:WLI_CRYPTO_CERT_ADD_TO_STORE_EXCEPTION_REASON]; return nil;
} else { i++; NSLog(@"[%@] Adding cert to store OK", NSStringFromSelector(_cmd)); NSString *thumbprint = [self thumbprintForCertContext:pCertContext]; if (!thumbprint) { CleanUp(); [self handleException:WLI_CRYPTO_CERT_GET_THUMBPRINT_EXCEPTION_REASON]; return nil; } else { DWORD keytype = 0; HCRYPTPROV hCryptProv =0; NSLog(@"[%@] Cert thumbprint:%@", NSStringFromSelector(_cmd), thumbprint); if(!CryptAcquireCertificatePrivateKey(pCertContext, 0, NULL, &hCryptProv, &keytype, NULL)) { continue; }else { NSLog(@"[%@] Found private key. %lu", NSStringFromSelector(_cmd),hCryptProv); imported = true; } CRYPT_PIN_PARAM pinParam; pinParam.type = CRYPT_PIN_PASSWD; pinParam.dest.passwd = (char *)[password cStringUsingEncoding:NSUTF8StringEncoding]; if(!CryptSetProvParam(hCryptProv,PP_CHANGE_PIN,(BYTE *)&pinParam, NULL)) { fprintf (stderr, " ############ Last error after pin 0x%08x \n",CSP_GetLastError()); CleanUp(); [self handleException:WLI_CRYPTO_CERT_ADD_TO_STORE_EXCEPTION_REASON]; return nil; }else{ fprintf (stderr, " ############ Last error after pin 0x%08x \n",CSP_GetLastError()); } } } } if(!imported){ CleanUp(); [self handleException:WLI_CRYPTO_FAILED_TO_FIND_CERT]; return nil;
} if(i==0){ CleanUp(); [self handleException:WLI_CRYPTO_CERT_ADD_TO_STORE_EXCEPTION_REASON]; return nil; } CleanUp(); return @""; }]; }
На устройстве iPhone 11 при вызове PFXImportCertStore появляется ошибка:-2146881280, на других устройствах(и даже на аналогичных iPhone 11) такой проблемы нет Подскажите, пожалуйста, из-за чего это может может происходить и в какую сторону копать?
|