Я пытаюсь подключиться к VPN с помощью Swift в Xcode. Я использую 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")
, потому что для этого поля требуется
Постоянная ссылка на цепочку ссылок на элемент keychain, содержащий IKE общий секрет.
Что еще,
Постоянная ссылка на цепочку ключей должна ссылаться на элемент связки ключей class kSecClassGenericPassword.
Я не уверен, если я сделаю это правильно. Я не подклассифицировал kSecClassGenericPassword или использовал его каким-либо образом.
Когда я использую эту функцию в коде, окно показывает с информацией, что для этого VPN нет общего секрета. Я думаю, это означает, что этот брелок не работает так, как он предполагал.
В настройках iPhone он пытается подключиться, переключается на зеленый и сразу же переключается в состояние "выключено". Когда я помещаю те же данные, что и в коде вручную, соединение работает.
Что я делаю неправильно? Что я должен исправить?