NEVPNManager VPN配置SharedSecret错误

时间:2018-05-14 16:51:12

标签: ios xcode vpn nevpnmanager

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

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

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

enter image description here

我在这里使用了代码

  - (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;
}

1 个答案:

答案 0 :(得分:0)

您正在将sharedSecretReference设置为NSData,但这与它的定义冲突。

NEVPNProtocolIPSec::sharedSecretReference定义为:

  

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

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

您将需要使用SecItemCopyMatching和返回类型kSecReturnPersistentRef来实现此目的。