Я создаю приложение 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, ©Result)
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)
}
}
}