0

我想与我的 VPN 服务器建立 VPN 连接。我从数字海洋安装了 VPN 服务器。

我想通过使用我的 VPN 连接设置使用 Objective-C 为 IOS 制作 VPN 应用程序。

在这里我遇到了问题:没有提供 VPN 共享密钥。

在此处输入图像描述

在这里我使用了代码

  - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.

    [[NEVPNManager sharedManager] setEnabled:YES];
    [[NEVPNManager sharedManager] loadFromPreferencesWithCompletionHandler: ^(NSError *error) {



        NEVPNProtocolIPSec *p = [[NEVPNProtocolIPSec alloc] init];
        p.serverAddress =@"178.62.78.101";
        p.authenticationMethod = NEVPNIKEAuthenticationMethodSharedSecret;
        p.useExtendedAuthentication = YES;

        NSString *secret = @"gfJL$$";
        NSData *secretData = [secret dataUsingEncoding:NSUTF8StringEncoding];


        p.sharedSecretReference=secretData;
        p.localIdentifier=@"londra1";
        p.username=@"root";
        p.passwordReference=[[SSKeychain passwordForService:@"2eee9fa59" account:@"2eee9fa5"] dataUsingEncoding:NSUTF8StringEncoding];
        p.disconnectOnSleep = NO;


        [NEVPNManager sharedManager].protocolConfiguration=p;

        NSMutableArray *rules = [[NSMutableArray alloc] init];
        NEOnDemandRuleConnect *connectRule = [NEOnDemandRuleConnect new];
        [rules addObject:connectRule];
        [[NEVPNManager sharedManager] setOnDemandRules:rules];
        [[NEVPNManager sharedManager] setLocalizedDescription:@"vpn"];

        [[NEVPNManager sharedManager] setEnabled:YES];



        [[NEVPNManager sharedManager] saveToPreferencesWithCompletionHandler: ^(NSError *error) {

            NSLog(@"Save VPN to preference complete");
            if (error) {
                NSLog(@"Save error: %@", error);
            }

        }];

        NSError *startError;
        [[NEVPNManager sharedManager].connection startVPNTunnelAndReturnError:&startError];
        if(startError) {
            NSLog(@"Start error: %@", startError.localizedDescription);
        }

    }];
    return YES;
}
4

1 回答 1

0

您设置sharedSecretReferenceNSData,但这与它的定义相冲突。

NEVPNProtocolIPSec::sharedSecretReference定义为:

对包含 IKE 共享密钥的钥匙串项的持久钥匙串引用。

您需要创建一个类型的钥匙串项kSecClassGenericPassword以用作共享密钥,并提供对钥匙串项的持久引用。持久引用在这里至关重要,因为它可以存储到磁盘或在进程之间传递,这是NEVPNManager访问共享密钥和连接 VPN 所必需的。我怀疑虽然passwordReference 似乎是由钥匙串项设置的,但它也可能不会返回持久引用。

您将需要使用SecItemCopyMatchingwith return typekSecReturnPersistentRef来实现这一点。

于 2018-10-25T12:51:28.637 回答