使用 NEVPNManager 如何设置 SharedSecretReference

Using NEVPNManager how do I set SharedSecretReference

所以我正在尝试使用 NEVPNManager 以编程方式设置我的 VPN。 我被困在配置上,真的很困惑什么在哪里。

sharedSecretReference 真让我失望。 我在其他地方看到过说我需要使用钥匙串的东西,但是如何以及为什么。我可以手动使用大约 6 个选项连接到这个 VPN,所以为什么我需要这么多。

如果您发现我可能做错的任何其他事情,请告诉我。这是我目前使用的确切代码

    NEVPNProtocolIPSec *p = [[NEVPNProtocolIPSec alloc] init];
    p.username = [config objectForKey: @"username"];
    p.passwordReference = [config objectForKey: @"password"];
    p.serverAddress = [config objectForKey: @"ip"];
    p.localIdentifier = [config objectForKey: @"vpn"];
    p.remoteIdentifier = [config objectForKey: @"vpn"];
    p.useExtendedAuthentication = NO;
    p.authenticationMethod = NEVPNIKEAuthenticationMethodSharedSecret;   
    p.disconnectOnSleep = NO;

    p.sharedSecretReference = [config objectForKey: @"psk"];

需要了解的重要一点是,您正在为 NEVPNManager 提供一个可用于启动 VPN 连接的配置,即使您的应用处于非活动状态(通过“设置”应用)也是如此。 VPN 管理器需要能够在不通过您的应用程序的情况下从钥匙串中获取安全数据(共享机密或密码)。为此,它使用对钥匙串中秘密的持久引用,而不是秘密本身。如果你使用像 KeychainAccess 这样的库,很容易获得这个引用并设置它:

let keychain = Keychain()
let persistentRefSharedSecret = keychain[attributes: "my_shared_secret"].persistentRef
let persistentRefPassword = keychain[attributes: "my_password"].persistentRef

...

p.sharedSecretReference = persistentRefSharedSecret
p.passwordReference = persistentRefPassword