与 VPN 服务器的协商失败(NEVPNProtocolIPSec,Swift 3.0.2)
Negotiation with the VPN server has failed (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 服务器的协商失败”。
顺便说一句,是否有可能发现这种错误?
显然,iOS SDK 有一个错误,根据 this 的回答。
Afaik SDK 将本地标识符视为组名,设置后,客户端将启动攻击模式 IKE_SA。事实证明,即使你在后端允许激进模式,它也不会改变太多(在我的情况下它没有)。
删除行
prtcl.localIdentifier = "Test iOS device"
prtcl.remoteIdentifier = server.name
修复了问题。
我遇到了同样的错误,因为密码和 sharedSecret 钥匙串值已经过时了。
伙计们。
我正在尝试设置到我的服务器的 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 服务器的协商失败”。 顺便说一句,是否有可能发现这种错误?
显然,iOS SDK 有一个错误,根据 this 的回答。 Afaik SDK 将本地标识符视为组名,设置后,客户端将启动攻击模式 IKE_SA。事实证明,即使你在后端允许激进模式,它也不会改变太多(在我的情况下它没有)。
删除行
prtcl.localIdentifier = "Test iOS device"
prtcl.remoteIdentifier = server.name
修复了问题。
我遇到了同样的错误,因为密码和 sharedSecret 钥匙串值已经过时了。