我想与我的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;
}
答案 0 :(得分:0)
您正在将sharedSecretReference
设置为NSData
,但这与它的定义冲突。
NEVPNProtocolIPSec::sharedSecretReference
定义为:
对包含IKE共享机密的钥匙串项的持久钥匙串引用。
您需要创建kSecClassGenericPassword
类型的钥匙串项目以用作共享密钥,并为钥匙串项目提供 永久引用 。持久引用在这里至关重要,因为持久引用可以存储到磁盘或在进程之间传递,NEVPNManager
才能访问共享密钥并连接VPN。我怀疑尽管passwordReference
似乎是由钥匙串项设置的,但它也可能不会返回持久引用。
您将需要使用SecItemCopyMatching
和返回类型kSecReturnPersistentRef
来实现此目的。