如何创建与MultiPeerConnectivity一起使用的SecIdentityRef?

时间:2016-06-09 09:54:52

标签: ios swift ssl x509 multipeer-connectivity

我需要在 Swift iOS 应用程序中为 MultiPeer Connectivity 交换实现身份验证部分。所以我需要在创建SecIdentityRef时创建一个MCSession对象(如MCSession(peer: myPeerId, securityIdentity: secIdentity, encryptionPreference: MCEncryptionPreference.Required))。

我已经创建了一个带Keychain访问权限的X509证书并将其保存到.p12文件中。我还有可以使用的.cgi和.der格式的证书。

我想知道这些证书中的任何一个是否值得在我的应用程序中使用,如果是的话,如何使用它?是否可以将证书直接放在项目目录中并在应用程序中导入其数据,或者我是否需要使用服务器来提供证书?

最后但并非最不重要的是,我不知道如何从给定证书创建SecIdentityRef。我试图浏览Apple Developer对类MCSessionSecIdentityRefSecCertificateRef甚至CFData的引用,但我发现没有什么可以帮助我。

1 个答案:

答案 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,他的代码片段帮助我构建了解决方案。