Ошибка согласования с VPN-сервером (NEVPNProtocolIPSec, Swift 3.0.2)

ребята.

Я пытаюсь настроить VPN-соединение со своим сервером, но что-то идет не так.

Пробовал настроить вручную, работает.

Вот мой код конфигурации. У объекта сервера наверняка есть имя и правильный хост, и я попытался отключить расширенную аутентификацию. Удаленные и локальные идентификаторы Afaik - это просто случайные строки, поэтому я понятия не имею, что я мог сделать неправильно.

fileprivate func updateCurrentVPN(withServer server: Server, completion: ((Bool) -> Void)?) {

    let passwordRef = KeychainWrapper.standard.dataRef(forKey: self.account.username)
    let secretRef = KeychainWrapper.standard.dataRef(forKey: API.ipsecSecretKey())

    // checking if the strings are correct in a debugger
    let password = KeychainWrapper.standard.string(forKey: self.account.username)
    let secret = KeychainWrapper.standard.string(forKey: API.ipsecSecretKey())

    // VPN
    let manager = NEVPNManager.shared()
    manager.loadFromPreferences { (error) in
        if (error != nil)
        {
            print("Error: ", error.debugDescription)
            completion?(false)
        }
        else
        {
            let prtcl = NEVPNProtocolIPSec()
            prtcl.username = self.account.username
            prtcl.passwordReference = passwordRef
            prtcl.serverAddress = server.host
            prtcl.authenticationMethod = NEVPNIKEAuthenticationMethod.sharedSecret
            prtcl.sharedSecretReference = secretRef
            prtcl.localIdentifier = "Test iOS device"
            prtcl.remoteIdentifier = server.name
            prtcl.useExtendedAuthentication = true
            prtcl.disconnectOnSleep = false

            manager.isEnabled = true
            manager.protocolConfiguration = prtcl
            manager.isOnDemandEnabled = false
            manager.localizedDescription = "MyVPN Configuration"
            manager.saveToPreferences(completionHandler: { (error) in
                if (error != nil)
                {
                    print("Error: ", error.debugDescription)
                    completion?(false)
                }
                else
                {
                    self.serverButton.setTitle(server.name, for: UIControlState.normal)
                    print("VPN prefs saved")
                    completion?(true)
                }
            })
        }
    }

После сохранения конфигурации я делаю:

 let manager = NEVPNManager.shared()
 do {
    try manager.connection.startVPNTunnel()
 } catch {
    print(error.localizedDescription)
    connectButton.setTitle("da failure :(", for: UIControlState.normal)
 }

Но он никогда не выдает ошибку, а просто предлагает мне «Сбой согласования с VPN-сервером» в системном предупреждении. Кстати, можно ли поймать такие ошибки?


person bitemybyte    schedule 14.02.2017    source источник


Ответы (2)


Судя по всему, ошибка iOS SDK, согласно этому ответу. Afaik SDK обрабатывает локальный идентификатор как имя группы, и когда он установлен, клиент инициирует агрессивный режим IKE_SA. Оказалось, даже если вы разрешите агрессивный режим на бэкенде, это мало что изменит (в моем случае не изменилось).

Удаление линий

prtcl.localIdentifier = "Test iOS device"
prtcl.remoteIdentifier = server.name

решает проблему.

person bitemybyte    schedule 14.02.2017

У меня была та же ошибка, потому что значения пароля и цепочки ключей sharedSecret устарели.

person Stanislav Mayorov    schedule 12.06.2018