我正在尝试使用Xcode中的Swift连接到VPN。我使用KeychainSwift保存密钥链引用。我的代码如下所示:
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设置中,它尝试连接,将开关移向绿色,然后开关立即回到“关闭”状态。当我手动将相同的数据放在代码中时,连接就可以工作了。
我做错了什么?我该纠正什么?
发布于 2017-09-07 12:03:38
好吧,我有答案了。在对SecItemCopyMatching的查询中,我不得不选择带有kCFBooleanTrue的kSecReturnPersistentRef -而不是kSecReturnData。
https://stackoverflow.com/questions/45639312
复制相似问题