这个函数的参数是一个Base64编码的PKCS#12证书字符串,然后解码并传递给SecPKCS12Import函数。在iOS 11之后的更新中,SecPKCS12Import会产生不同的结果。在两个操作系统版本上,安全错误返回值都为0。
let securityError: OSStatus = SecPKCS12Import(decodedData!, options, &items)
返回0个项目的列表。而在iOS 10中,数组中会有1个项目。
func certificateFromCertificate(certP12: String, psswd: String) -> SecCertificate {
let decodedData = NSData(base64Encoded: certP12, options:NSData.Base64DecodingOptions(rawValue: 0))
let keytmp : NSString = kSecImportExportPassphrase as NSString
let options : NSDictionary = [keytmp : psswd]
var certificateRef: SecCertificate? = nil
var items : CFArray?
let securityError: OSStatus = SecPKCS12Import(decodedData!, options, &items)
let theArray: CFArray = items!
if securityError == noErr && CFArrayGetCount(theArray) > 0 {
let newArray = theArray as [AnyObject] as NSArray
let dictionary = newArray.object(at: 0)
let secIdentity = (dictionary as AnyObject)[kSecImportItemIdentity as String] as! SecIdentity
let securityError = SecIdentityCopyCertificate(secIdentity , &certificateRef)
if securityError != noErr {
certificateRef = nil
}
}
certificate = certificateRef
return certificateRef!
}
这是一个在苹果开发者论坛上的帖子,说SecPKCS12Import实现了自动转换Base64。这意味着在将证书传递给函数之前,我应该对普通证书进行解码。这可能是问题所在吗?
我已经向Apple论坛和技术支持事件提交了帖子。 开发环境: 编程语言:Swift 3
调试设备:Apple iPad mini Retina Wi-Fi 32GB ME280SL/A
开发设备:iMAC mini Xcode版本9.0 9A235
decodedData
里面有东西吗?options
呢? - AdamcertP12
的值,它是相同的。 - MareksecurityError
?DecodedData
呢? - Brandon