作者:云海雨岛 | 来源:互联网 | 2023-01-23 15:15
我正在尝试使用Xcode中的Swift连接到VPN.我正在使用KeychainSwift来保存钥匙串参考.我的代码看起来像这样:
private func connectVPN(completion: @escaping () -> Void) {
let keychain = KeychainSwift()
keychain.set("", forKey: "passref")
keychain.set("", forKey: "secretref")
NEVPNManager.shared().loadFromPreferences { error in
let vpnhost = "<11.11.11.11>"
let username = ""
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共享密钥的钥匙串项的持久性钥匙串引用.
更重要的是,
持久性keychain引用必须引用类kSecClassGenericPassword的keychain项.
如果我做得对,我不太确定.我没有子类kSecClassGenericPassword或以任何方式使用它.
当我在代码中使用此功能时,一个窗口显示信息,该VPN没有共享密钥.我认为这意味着这个钥匙串不能正常运作.
在iPhone设置中,它尝试连接,将开关切换到绿色,并立即切换回"关闭"状态.当我手动输入与代码相同的数据时,连接起作用.
我究竟做错了什么?我应该纠正什么?