我需要在 Swift iOS 应用程序中为 MultiPeer Connectivity 交换实现身份验证部分。所以我需要在创建SecIdentityRef
时创建一个MCSession
对象(如MCSession(peer: myPeerId, securityIdentity: secIdentity, encryptionPreference: MCEncryptionPreference.Required)
)。
我已经创建了一个带Keychain访问权限的X509证书并将其保存到.p12文件中。我还有可以使用的.cgi和.der格式的证书。
我想知道这些证书中的任何一个是否值得在我的应用程序中使用,如果是的话,如何使用它?是否可以将证书直接放在项目目录中并在应用程序中导入其数据,或者我是否需要使用服务器来提供证书?
最后但并非最不重要的是,我不知道如何从给定证书创建SecIdentityRef
。我试图浏览Apple Developer对类MCSession
,SecIdentityRef
,SecCertificateRef
甚至CFData
的引用,但我发现没有什么可以帮助我。
答案 0 :(得分:2)
我想出了如何为 Multipeer Connectivity 会话建立导入证书。
在下面的示例中,我们假设我们在supportedFiles / certificate.p12下有证书。此外,您的证书必须受密码保护,因为我已经知道证书管理API不支持不受保护的证书。
func getIdentity (password : String?) -> SecIdentityRef? {
// Load certificate file
let path = NSBundle.mainBundle().pathForResource("certificate", ofType : "p12")
let p12KeyFileContent = NSData(contentsOfFile: path!)
if (p12KeyFileContent == nil) {
NSLog("Cannot read PKCS12 file from \(path)")
return nil
}
// Setting options for the identity "query"
let options = [String(kSecImportExportPassphrase):password ?? ""]
var citems: CFArray? = nil
let resultPKCS12Import = withUnsafeMutablePointer(&citems) { citemsPtr in
SecPKCS12Import(p12KeyFileContent!, options, citemsPtr)
}
if (resultPKCS12Import != errSecSuccess) {
return nil
}
// Recover the identity
let items = citems! as NSArray
let myIdentityAndTrust = items.objectAtIndex(0) as! NSDictionary
let identityKey = String(kSecImportItemIdentity)
let identity = myIdentityAndTrust[identityKey] as! SecIdentity
print("identity : ", identity)
return identity as SecIdentityRef
}
但是,我仍然不知道在应用程序文件中使用证书是否是安全威胁。
编辑:感谢neilco,他的代码片段帮助我构建了解决方案。