Ссылка на пароль IKEv2 из цепочки для ключей
Я пытаюсь реализовать подключение IKEv2 vpn на Mac OSX с использованием инфраструктуры NetworkExtension. Каждый раз, когда я получаю всплывающее окно для ввода моего пароля для подключения к VPN. Согласно спецификации NEVPNProtocol пароль может быть предоставлен путем предоставления постоянной ссылки на пароль, хранящийся в связке ключей. Но это не работает. Я попробовал тот же код конфигурации IKEv2 в iOS, и он работает отлично.
Я написал пример приложения, чтобы продемонстрировать, как я это делаю - https://github.com/kestutisbalt/osx-ikev2-sample
Как пароль хранится в связке ключей:
class func set(key: String, value: String) {
let query: [NSObject: AnyObject] = [
kSecValueData: value.dataUsingEncoding(NSUTF8StringEncoding)!,
kSecClass: kSecClassGenericPassword,
kSecAttrGeneric: key,
kSecAttrAccount: key,
kSecAttrAccessible: kSecAttrAccessibleAlways,
kSecAttrService: NSBundle.mainBundle().bundleIdentifier!
]
clear(key)
SecItemAdd(query as CFDictionaryRef, nil)
}
Как постоянная ссылка извлекается из цепочки для ключей:
class func persistentRef(key: String) -> NSData? {
let query: [NSObject: AnyObject] = [
kSecClass: kSecClassGenericPassword,
kSecAttrGeneric: key,
kSecAttrAccount: key,
kSecAttrAccessible: kSecAttrAccessibleAlways,
kSecMatchLimit: kSecMatchLimitOne,
kSecAttrService: NSBundle.mainBundle().bundleIdentifier!,
kSecReturnPersistentRef: kCFBooleanTrue
]
var secItem: AnyObject?
let result = SecItemCopyMatching(query, &secItem)
if result != errSecSuccess {
return nil
}
return secItem as? NSData
}
Конфигурация IKEv2:
private func createIKEv2Protocol(host: String,
username: String, password: String) -> NEVPNProtocolIKEv2 {
Keychain.set(username, value: password)
let passwordRef = Keychain.persistentRef(username)
if passwordRef == nil {
log("Failed to query password persistent ref")
}
let config = NEVPNProtocolIKEv2()
config.remoteIdentifier = host
config.serverAddress = host
config.useExtendedAuthentication = true
config.username = username
config.passwordReference = passwordRef
return config
}
1 ответ
Служба поддержки Apple ответила на мой вопрос:
The issue with your code is that it’s attempting to set up VPN in an unsupported way. Specifically, IKEv2 VPN does not support password-based authentication. The options you have for IKEv2 are listed in the NEVPNIKEAuthenticationMethod
enum, а именно.Certificate и.SharedSecret.