Ios Swift中的CFYREF问题
我正在将一些较旧的Objective-C代码转换为Swift,这样我就可以摆脱一些不推荐的方法,但我一直遇到崩溃,到目前为止,我似乎还不知道是什么导致了它。我正在从P12证书中获取私钥,这个方法似乎工作得很好,直到我真正需要从CFArray中获取字典为止,即使数组中有值,应用程序也会不断崩溃。以下是我的代码:Ios Swift中的CFYREF问题,ios,swift,core-foundation,cfdictionary,Ios,Swift,Core Foundation,Cfdictionary,我正在将一些较旧的Objective-C代码转换为Swift,这样我就可以摆脱一些不推荐的方法,但我一直遇到崩溃,到目前为止,我似乎还不知道是什么导致了它。我正在从P12证书中获取私钥,这个方法似乎工作得很好,直到我真正需要从CFArray中获取字典为止,即使数组中有值,应用程序也会不断崩溃。以下是我的代码: func privateKeyFromCertificate(p12Name: String, withPassword password: String) -> SecKeyRef
func privateKeyFromCertificate(p12Name: String, withPassword password: String) -> SecKeyRef {
let resourcePath: String = NSBundle.mainBundle().pathForResource(p12Name, ofType: "p12")!
let p12Data: NSData = NSData(contentsOfFile: resourcePath)!
let key : NSString = kSecImportExportPassphrase as NSString
let options : NSDictionary = [key : password]
var privateKeyRef: SecKeyRef? = nil
var items : CFArray?
let securityError: OSStatus = SecPKCS12Import(p12Data, options, &items)
let description : CFString = CFCopyDescription(items)
print(description)
if securityError == noErr && CFArrayGetCount(items) > 0 {
let objects : CFDictionaryRef = CFArrayGetValueAtIndex(items, 0) as! CFDictionaryRef
let kString : NSString = kSecImportItemIdentity as NSString
let identity : SecIdentityRef = CFDictionaryGetValue(objects, unsafeAddressOf(kString)) as! SecIdentityRef
let securityError = SecIdentityCopyPrivateKey(identity, &privateKeyRef)
if securityError != noErr {
privateKeyRef = nil
}
}
return privateKeyRef!
}
在我试图从CFArray获取CFDictionaryRef的第一行的if语句中,应用程序一直崩溃。我添加了一行以打印CFArray的描述作为测试,它确实有值:
<CFArray 0x7fd2d2e8c2f0 [0x10b61f7b0]>{type = mutable-small, count = 1, values = (
0 : <CFBasicHash 0x7fd2d2e8c190 [0x10b61f7b0]>{type = mutable dict, count = 3,entries =>
0 : <CFString 0x10bfdd2c0 [0x10b61f7b0]>{contents = "trust"} = <SecTrustRef: 0x7fd2d2e8ad30>
1 : <CFString 0x10bfdd300 [0x10b61f7b0]>{contents = "identity"} = <SecIdentityRef: 0x7fd2d2e80390>
2 : <CFString 0x10bfdd2e0 [0x10b61f7b0]>{contents = "chain"} = <CFArray 0x7fd2d2d016e0 [0x10b61f7b0]>{type = mutable-small, count = 1, values = (
0 : <cert(0x7fd2d2e8c610) s: Client (IPHONE-WebService) i:Client (IPHONE-WebService)>)}}
{type=mutable small,count=1,value=(
0:{type=mutable dict,count=3,entries=>
0:{contents=“trust”}=
1:{contents=“identity”}=
2:{contents=“chain”}={type=mutable small,count=1,value=(
0 : )}}
我最终改变了一些东西来获取数据,这不是最漂亮的方法,但对我来说很有效
func privateKeyFromCertificate() -> SecKeyRef {
let certName : String = //name of the certificate//
//get p12 file path
let resourcePath: String = NSBundle.mainBundle().pathForResource(certName, ofType: "p12")!
let p12Data: NSData = NSData(contentsOfFile: resourcePath)!
//create key dictionary for reading p12 file
let key : NSString = kSecImportExportPassphrase as NSString
let options : NSDictionary = [key : "password_for_certificate"]
//create variable for holding security information
var privateKeyRef: SecKeyRef? = nil
var items : CFArray?
let securityError: OSStatus = SecPKCS12Import(p12Data, options, &items)
//let description : CFString = CFCopyDescription(items)
//print(description)
let theArray : CFArray = items!
if securityError == noErr && CFArrayGetCount(theArray) > 0 {
let newArray = theArray as [AnyObject] as NSArray
let dictionary = newArray.objectAtIndex(0)
let secIdentity = dictionary.valueForKey(kSecImportItemIdentity as String) as! SecIdentityRef
let securityError = SecIdentityCopyPrivateKey(secIdentity , &privateKeyRef)
if securityError != noErr {
privateKeyRef = nil
}
}
return privateKeyRef!
}
我也有同样的问题:(,你找到解决办法了吗?