Невозможно подключиться к VPN серверу macOS и iOS - PullRequest
0 голосов
/ 19 марта 2019

Я создаю приложение vpn mac и приложение iOS, когда пытаюсь подключиться, получая The VPN server did not respond. Verify the server address and try reconnecting., но когда я пытаюсь вручную в системных настройках установить соединение,

это учетные данные

адрес сервера: 45.32.23.55

имя пользователя: vpn

пароль: vpn

sharedsecret: vpn


    func vpnLoader() {

        vpnManager.loadFromPreferences { error in
            // setup the config:
        let p = NEVPNProtocolIPSec()
        p.username = "vpn"
        p.serverAddress =  "45.32.23.55"
        p.remoteIdentifier = "45.32.23.55"
        p.localIdentifier = "192.168.xx.xxx"
        p.authenticationMethod = .sharedSecret
            do {

                p.sharedSecretReference = try VPNKeychain.persistentReferenceFor(service: "45.32.23.55", account: "vpn", password: ("vpn").data(using: String.Encoding.utf8, allowLossyConversion: false)!)
                p.passwordReference = try VPNKeychain.persistentReferenceFor(service: "45.32.23.55", account: "vpn", password: ("vpn").data(using: String.Encoding.utf8, allowLossyConversion: false)!)
            } catch let error {
                print(error)
            }

        p.useExtendedAuthentication = true
        p.disconnectOnSleep = false
        self.vpnManager.protocolConfiguration = p
        self.vpnManager.localizedDescription = "secure_VPN"
        self.vpnManager.isEnabled = true
        self.vpnManager.isOnDemandEnabled = true
            print("saving")
            assert(self.vpnManager.isEnabled)

            self.vpnManager.saveToPreferences { error in
                guard error == nil else {
                    print("NEVPNManager.saveToPreferencesWithCompletionHandler failed: \(error!.localizedDescription)")
                    return
                }
          do {
                try self.vpnManager.connection.startVPNTunnel()

            } catch let error {
                print("Error starting VPN Connection \(error.localizedDescription)");
            }

            }
        }
//        self.vpnManager.saveToPreferences(completionHandler: self.vpnSaveHandler)

    }

используя приведенный выше код, я сохраняю настройки икод ниже для сохранения и получения ссылки на пароль и общей секретной ссылки из цепочки для ключей.

enum VPNKeychain {

    static func persistentReferenceFor(service: String, account: String, password: Data) throws -> Data {
        var copyResult: CFTypeRef? = nil
        let err = SecItemCopyMatching([
            kSecClass: kSecClassGenericPassword,
            kSecAttrService: service,
            kSecAttrAccount: account,
            kSecReturnPersistentRef: true,
            kSecReturnData: true
            ] as NSDictionary, &copyResult)
        switch err {
        case errSecSuccess:
            return try self.persistentReferenceByUpdating(copyResult: copyResult!, service: service, account: account, password: password)
        case errSecItemNotFound:
            return try self.persistentReferenceByAdding(service: service, account:account, password: password)
        default:
            try throwOSStatus(err)
            // `throwOSStatus(_:)` only returns in the `errSecSuccess` case.  We know we're
            // not in that case but the compiler can't figure that out, alas.
            fatalError()
        }
    }



    private static func persistentReferenceByUpdating(copyResult: CFTypeRef, service: String, account: String, password: Data) throws -> Data {
        let copyResult = copyResult as! [String:Any]
        let persistentRef = copyResult[kSecValuePersistentRef as String] as! NSData as Data
        let currentPassword = copyResult[kSecValueData as String] as! NSData as Data
        if password != currentPassword {
            let err = SecItemUpdate([
                kSecClass: kSecClassGenericPassword,
                kSecAttrService: service,
                kSecAttrAccount: account,
                ] as NSDictionary, [
                    kSecValueData: password
                    ] as NSDictionary)
            try throwOSStatus(err)
        }
        return persistentRef
    }



    private static func persistentReferenceByAdding(service: String, account: String, password: Data) throws -> Data {
        var addResult: CFTypeRef? = nil
        let err = SecItemAdd([
            kSecClass: kSecClassGenericPassword,
            kSecAttrService: service,
            kSecAttrAccount: account,
            kSecValueData: password,
            kSecReturnPersistentRef: true,
            ] as NSDictionary, &addResult)
        try throwOSStatus(err)
        return addResult! as! NSData as Data
    }


    private static func throwOSStatus(_ err: OSStatus) throws {
        guard err == errSecSuccess else {
            throw NSError(domain: NSOSStatusErrorDomain, code: Int(err), userInfo: nil)
        }
    }
}

...