NE***Manager 中使用的 Swift 中的钥匙串引用

Posted

技术标签:

【中文标题】NE***Manager 中使用的 Swift 中的钥匙串引用【英文标题】:Keychain references in Swift used in NE***Manager 【发布时间】:2018-01-20 05:08:19 【问题描述】:

我正在尝试在 Xcode 中使用 Swift 连接到 ***。我正在使用 KeychainSwift 来保留钥匙串引用。我的代码如下所示:

    private func connect***(completion: @escaping () -> Void)  
        let keychain = KeychainSwift()
        keychain.set("<mypassword>", forKey: "pas-s-ref")
        keychain.set("<sharedsecretpassword>", forKey: "secretref")

        NE***Manager.shared().loadFromPreferences  error in
            let ***host = "<11.11.11.11>"
            let username = "<myusername>"

            let p = NE***ProtocolIPSec()
            p.username = username
            p.localIdentifier = username
            p.serverAddress = ***host
            p.remoteIdentifier = ***host
            p.authenticationMethod = .sharedSecret
            p.disconnectOnSleep = false

            p.sharedSecretReference = keychain.getData("secretref")
            p.passwordReference = keychain.getData("pas-s-ref")

            var rules = [NEOnDemandRule]()
            let rule = NEOnDemandRuleConnect()
            rule.interfaceTypeMatch = .any
            rules.append(rule)

            NE***Manager.shared().localizedDescription = "My ***"
            NE***Manager.shared().protocolConfiguration = p
            NE***Manager.shared().onDemandRules = rules
            NE***Manager.shared().isOnDemandEnabled = true
            NE***Manager.shared().isEnabled = true
            NE***Manager.shared().saveToPreferences  error in
                if (error != nil) 
                    print(error!)
                 else 
                    do 
                        try NE***Manager.shared().connection.start***Tunnel()
                        completion()
                     catch 
                        print("can't connect ***'")
                    
                
            
        
    

我用的是keychain.getData("secretref"),因为这个字段需要

对包含 IKE 的钥匙串项的持久钥匙串引用 共享秘密。

还有,

持久的钥匙串引用必须引用一个钥匙串项 类 kSecClassGenericPassword。

我不太确定,如果我做得对。我没有继承 kSecClassGenericPassword 或以任何方式使用它。

当我在代码中使用此功能时,会显示一个窗口,其中包含有关此 *** 没有共享密钥的信息。我认为这意味着这个钥匙串不能正常工作。

在 iPhone 设置中,它尝试连接,将开关移至绿色,然后开关立即返回“关闭”状态。当我手动输入与代码中相同的数据时,连接正常。

我做错了什么?我应该更正什么?

【问题讨论】:

put log: print(keychain.set("", forKey: "secretref")),我查看了SwiftKeychain lib,发现它保存在kSecClassGenericPassword中并提供更多信息请从控制台。 也可以使用 keychain.set("hello world", forKey: "my key") if keychain.lastResultCode != noErr /* 报错 */ 是的,他们就是这么说的:github.com/evgenyneu/keychain-swift 我试过了。 lastResultCode 为 0,没有错误。 【参考方案1】:

好的,我有答案了。在对 SecItemCopyMatching 的查询中,我必须选择带有 kCFBooleanTrue 的 kSecReturnPersistentRef - 而不是 kSecReturnData。

【讨论】:

以上是关于NE***Manager 中使用的 Swift 中的钥匙串引用的主要内容,如果未能解决你的问题,请参考以下文章

网络扩展 - NE***Manager

在 iOS 8 中使用 NE***Manager,如何以编程方式创建与自定义 *** 类型的 *** 连接? (例如思科任何连接)

NE***Manager.saveToPreferencesWithCompletionHandler 上的错误

无法在 iOS 上使用 NE***Manager 创建 IPSEC 连接

NE***Manager现在支持L2TP了吗?

在 iOS 的 Swift 中使用“locations array”或“manager.location.coordinate”哪一个来获取用户位置?