Как мы можем получить доступ к сертификату с идентификацией, хранящейся в цепочке для ключей приложения

Я находил способ получить доступ к сертификатам, установленным на устройстве 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)
        }
    }

Но он ничего не возвращает ни о каких элементах цепочки для ключей. У любого есть лучшее решение. Я новичок в программировании цепочки для ключей, так что помогите мне лучше понять и написать код для того же.

Спасибо

0 ответов

Другие вопросы по тегам