【问题标题】:MacOS VPN Error NO Shared Secret was Provided Objective-CMacOS VPN 错误没有提供共享密钥 Objective-C
【发布时间】:2019-03-29 10:38:51
【问题描述】:

我遇到了一个大问题,我为 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);
        }

    }];



}];

这里我放了一些截图;

【问题讨论】:

  • 你解决了这个问题吗?
  • @jarvis12 你有什么答案吗?我有同样的问题。

标签: ios objective-c xcode macos vpn


【解决方案1】:

看起来KeyChainHelper 是用于访问钥匙串的包装器。尚不清楚KeyChainHelper::load() 方法返回的确切内容,但我的猜测是标准 引用或数据。

NEVPNProtocolIPSec::sharedSecretReference 定义为:

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

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

您需要使用带有返回类型kSecReturnPersistentRefSecItemCopyMatching 来实现此目的。您的KeyChainHelper 类可能会提供一种方法来返回持久引用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-12
    • 1970-01-01
    • 1970-01-01
    • 2020-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-25
    相关资源
    最近更新 更多