MacOS VPN错误未提供共享机密-Objective-C

时间:2018-10-24 22:24:32

标签: ios objective-c xcode macos vpn

我面临一个大问题,我为IOS设备制作了一个VPN,它在appstore上,运行良好,但是我在macOS应用程序中遇到了问题,我使用了相同的代码。相同的代码适用于IOS设备,但它们却没有适用于MacOS应用程序。

问题说; 没有提供VPN共享密码。验证您的设置,然后尝试重新连接。

当我尝试连接到VPN时。

我用于连接VPN的代码

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

    NEVPNProtocolIPSec *p = [[NEVPNProtocolIPSec alloc] init];
    p.serverAddress =ipAddress;
    p.authenticationMethod = NEVPNIKEAuthenticationMethodSharedSecret;
    NSLog(@"vpn connecting to ip %@",ipAddress);


    p.username=@"vpnuser";
    p.sharedSecretReference = [KeyChainHelper load:sharedSecret];
    p.passwordReference = [KeyChainHelper load:password];
   // NSData * data = [self searchKeychainCopyMatching:sharedSecret];

    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 Fire"];


    [[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];

        delayStart(5)
        NSLog(@"%@",[NEVPNManager sharedManager]);
         NSLog(@"%@",[NEVPNManager sharedManager]);
        delayEnd


        if(startError) {
            NSLog(@"Start error: %@", startError.localizedDescription);
        }

    }];



}];

我在这里放了一些屏幕快照;

enter image description here

enter image description here

enter image description here

enter image description here

1 个答案:

答案 0 :(得分:0)

看起来KeyChainHelper是用于访问钥匙串的包装器。目前尚不清楚KeyChainHelper::load()方法返回什么,但是我猜测是 standard 引用还是数据。

NEVPNProtocolIPSec::sharedSecretReference定义为:

  

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

您需要创建kSecClassGenericPassword类型的钥匙串项目以用作共享密钥,并为钥匙串项目提供 永久引用 。持久引用在这里至关重要,因为持久引用可以存储到磁盘或在进程之间传递,NEVPNManager才能访问共享密钥并连接VPN。密码参考也是如此。

您将需要使用SecItemCopyMatching和返回类型kSecReturnPersistentRef来实现此目的。您的KeyChainHelper类可以提供一种返回持久引用的方法。