首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NEVPNManager中Swift中的密钥链引用

NEVPNManager中Swift中的密钥链引用
EN

Stack Overflow用户
提问于 2017-08-11 15:58:52
回答 1查看 804关注 0票数 11

我正在尝试使用Xcode中的Swift连接到VPN。我使用KeychainSwift保存密钥链引用。我的代码如下所示:

代码语言:javascript
复制
    private func connectVPN(completion: @escaping () -> Void) { 
        let keychain = KeychainSwift()
        keychain.set("<mypassword>", forKey: "passref")
        keychain.set("<sharedsecretpassword>", forKey: "secretref")

        NEVPNManager.shared().loadFromPreferences { error in
            let vpnhost = "<11.11.11.11>"
            let username = "<myusername>"

            let p = NEVPNProtocolIPSec()
            p.username = username
            p.localIdentifier = username
            p.serverAddress = vpnhost
            p.remoteIdentifier = vpnhost
            p.authenticationMethod = .sharedSecret
            p.disconnectOnSleep = false

            p.sharedSecretReference = keychain.getData("secretref")
            p.passwordReference = keychain.getData("passref")

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

            NEVPNManager.shared().localizedDescription = "My VPN"
            NEVPNManager.shared().protocolConfiguration = p
            NEVPNManager.shared().onDemandRules = rules
            NEVPNManager.shared().isOnDemandEnabled = true
            NEVPNManager.shared().isEnabled = true
            NEVPNManager.shared().saveToPreferences { error in
                if (error != nil) {
                    print(error!)
                } else {
                    do {
                        try NEVPNManager.shared().connection.startVPNTunnel()
                        completion()
                    } catch {
                        print("can't connect VPN'")
                    }
                }
            }
        }
    }

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

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

更重要的是,

持久密钥链引用必须引用类kSecClassGenericPassword的密钥链项。

我不太确定,我做得对不对。我没有子类kSecClassGenericPassword,也没有以任何方式使用它。

当我在代码中使用这个函数时,一个窗口会显示信息,这个VPN没有共享的秘密。我认为这意味着这个钥匙链不能正常工作。

在iPhone设置中,它尝试连接,将开关移向绿色,然后开关立即回到“关闭”状态。当我手动将相同的数据放在代码中时,连接就可以工作了。

我做错了什么?我该纠正什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-09-07 12:03:38

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45639312

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档