Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将SecIdentityRef添加到iOS密钥链,swift_Ios_Swift_Certificate_Keychain - Fatal编程技术网

如何将SecIdentityRef添加到iOS密钥链,swift

如何将SecIdentityRef添加到iOS密钥链,swift,ios,swift,certificate,keychain,Ios,Swift,Certificate,Keychain,我正在读取一个p12文件,并获得一个SecIdentityRef,然后将该身份添加到密钥链中,如下所示 let certData: NSData = NSFileManager.defaultManager().contentsAtPath(filePath)! let passDictionary: NSMutableDictionary = NSMutableDictionary() passDictionary.setValue("pass", forKey: kSecImportExpo

我正在读取一个
p12
文件,并获得一个
SecIdentityRef
,然后将该身份添加到密钥链中,如下所示

let certData: NSData = NSFileManager.defaultManager().contentsAtPath(filePath)!
let passDictionary: NSMutableDictionary = NSMutableDictionary()
passDictionary.setValue("pass", forKey: kSecImportExportPassphrase as String)
print(kSecImportExportPassphrase as String)
var items: CFArray?
let error = SecPKCS12Import(certData, passDictionary, &items)
let unwrappedItems:CFArray = items!
if error == noErr && CFArrayGetCount(items) > 0 {
    let certChain = unwrappedItems as [AnyObject] as NSArray
    let certificateDict = certChain.objectAtIndex(0)
    var privateKeyRef : SecKeyRef? = nil
    var certificateRef: SecCertificate? = nil
    let secIdentity:SecIdentityRef = certificateDict.valueForKey(kSecImportItemIdentity as String) as! SecIdentityRef
    let subject:NSString=SecCertificateCopySubjectSummary(certificateRef!)

    let keyChainQuery:NSMutableDictionary = NSMutableDictionary(
        objects: [String(kSecClassIdentity),subject,kCFBooleanTrue,String(kSecAttrAccessibleAlwaysThisDeviceOnly),secIdentity],
        forKeys: [String(kSecClass),String(kSecAttrLabel), String(kSecAttrCanSign),String(kSecAttrAccessible),String(kSecValueRef)])
    let status:OSStatus = SecItemAdd(keyChainQuery as CFDictionaryRef, nil)
}
这似乎工作正常,并返回0作为状态代码,但当我尝试从钥匙链读取此项时:

var identity: AnyObject?
let searchQuery: NSMutableDictionary = NSMutableDictionary(objects: [String(kSecClassIdentity), kCFBooleanTrue], forKeys: [String(kSecClass),String(kSecReturnRef)])
let status:OSStatus = SecItemCopyMatching(searchQuery as CFDictionaryRef, &identity)
我在identity中收到一个-25300错误代码(未找到项)
nil
,我正在使用
iOS 9.1
作为基本SDK,我做错了什么


更新:在8.1、8.4和9.1模拟器以及9.1真实设备中进行测试,代码正常工作。8.4.1版的iPhone出现了故障,有人知道发生了什么吗

最后,重新安装应用程序并使用SecItemDelete清理钥匙链解决了问题

希望这有帮助