如何创建用于 MultiPeerConnectivity 的 SecIdentityRef?

Posted

技术标签:

【中文标题】如何创建用于 MultiPeerConnectivity 的 SecIdentityRef?【英文标题】:How to create a SecIdentityRef to be used with MultiPeerConnectivity? 【发布时间】:2016-06-09 09:54:51 【问题描述】:

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

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

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

最后但同样重要的是,我不知道如何从给定的证书创建SecIdentityRef。我试图浏览 Apple Developer 的 MCSessionSecIdentityRefSecCertificateRef 甚至 CFData 类的参考资料,但我没有发现任何可能对我有帮助的东西。

【问题讨论】:

【参考方案1】:

我想出了如何为 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,他的sn-p 帮助我构建了我的解决方案。

【讨论】:

以上是关于如何创建用于 MultiPeerConnectivity 的 SecIdentityRef?的主要内容,如果未能解决你的问题,请参考以下文章

如何创建带有用于测试的图像的工厂

如何使用两个 xib 文件创建一个 Objective-C 类(一个用于 iPhone,另一个用于 iPad)

如何创建用于回归的神经网络?

如何创建仅用于测试的 Laravel 路由(phpunit)?

Django:如何动态创建模型仅用于测试

如何创建模式视图,用于在 iOS 中启动应用程序?