Как мы можем получить доступ к сертификату с идентификацией, хранящейся в цепочке для ключей приложения
Я находил способ получить доступ к сертификатам, установленным на устройстве ios, из приложения, опубликованного Meraki MDM.
Я просмотрел несколько онлайн-документов Apple, посты в блогах и Stackru Q/A. Где я получил ветку Q / A на форуме Apple https://forums.developer.apple.com/thread/52345 которой говорится, что даже если мы проталкиваем сертификаты через любой MDM, нет способа получить к нему доступ из приложения. https://developer.apple.com/library/content/qa/qa1745/_index.html говорит, что нет способа поделиться или получить доступ к цепочке для ключей, измененной Apple.
Поэтому для обхода проблемы я пытаюсь сохранить сертификат в цепочке ключей приложения, поэтому я могу получить к нему доступ позже.
Я использую фрагмент кода ниже, чтобы добавить сертификат в связку ключей
func addToKeychain(){
let rootCertPath = Bundle.main.path(forResource:"REST_Cert_20171107", ofType: "p12")!
let rootCertData = NSData(contentsOfFile: rootCertPath)!
var securityError:OSStatus = errSecSuccess
var items: CFArray?
let certOptions: Dictionary = [ kSecImportExportPassphrase as String : "Z123!" ];
securityError = SecPKCS12Import(rootCertData, certOptions as CFDictionary, &items);
if securityError == errSecSuccess {
let certItems:CFArray = items as CFArray!;
let certItemsArray:Array = certItems as Array
let dict:AnyObject? = certItemsArray.first;
if let certEntry:Dictionary = dict as? Dictionary<String, AnyObject> {
let identityPointer:AnyObject? = certEntry["identity"];
let secIdentityRef:SecIdentity = identityPointer as! SecIdentity!;
var certRef: SecCertificate?
SecIdentityCopyCertificate(secIdentityRef, &certRef);
let kSecClassValue = NSString(format: kSecClass)
let kSecClassCertificateValue = NSString(format: kSecClassCertificate)
let kSecValueRefValue = NSString(format: kSecValueRef)
let dict: [NSString: AnyObject] = [kSecClassValue:kSecClassCertificateValue, kSecValueRefValue:certRef!]
let error = SecItemAdd(dict as CFDictionary, nil)
if error == noErr {
print("Certificate Added Successfully");
} else if error == errSecDuplicateItem {
print("Certificate Already present in Keychain");
} else {
print("Certificate Installation failure")
}
}
}
}
Сертификаты добавляются в связку ключей, но когда я пытаюсь получить к ним доступ позже, я не могу получить их
var query:NSMutableDictionary = [kCFBooleanTrue:kSecReturnAttributes,kSecMatchLimitAll:kSecMatchLimit]
var secItemClasses:NSArray = [kSecClassGenericPassword,kSecClassInternetPassword,kSecClassCertificate,kSecClassKey,kSecClassIdentity]
for secItemClass in secItemClasses {
query[kSecClass] = secItemClass as! CFString
var result:CFTypeRef?
var securityError:OSStatus = errSecSuccess
securityError = SecItemCopyMatching(query as CFDictionary, &result)
if securityError == errSecSuccess{
print(result)
}else{
print(securityError)
}
}
Но он ничего не возвращает ни о каких элементах цепочки для ключей. У любого есть лучшее решение. Я новичок в программировании цепочки для ключей, так что помогите мне лучше понять и написать код для того же.
Спасибо