NEVPNManager VPN Config SharedSecret Ошибка - PullRequest
0 голосов
/ 14 мая 2018

Я хочу установить VPN-соединение с моим VPN-сервером. Я установил VPN-сервер из цифровых океанов.

Я хочу создать приложение VPN для IOS, используя target-C, используя мои настройки 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 голосов
/ 25 октября 2018

Вы устанавливаете sharedSecretReference как NSData, но это противоречит его определению.

NEVPNProtocolIPSec::sharedSecretReference определяется как:

Постоянная ссылка цепочки для ключей на элемент цепочки для ключей, содержащий общий секрет IKE.

Вам необходимо создать элемент цепочки для ключей типа kSecClassGenericPassword для использования в качестве общего секрета и предоставить постоянную ссылку на элемент цепочки для ключей. Постоянная ссылка имеет решающее значение, так как она может храниться на диске или передаваться между процессами, что требуется для NEVPNManager для доступа к общему секрету и подключения к вашей VPN. Я подозреваю, что хотя passwordReference кажется установленным элементом цепочки для ключей, он может не возвращать постоянную ссылку.

Вам нужно будет использовать SecItemCopyMatching с типом возврата kSecReturnPersistentRef для достижения этой цели.

...