我想与我的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;
}发布于 2018-10-25 20:51:29
您正在将sharedSecretReference设置为NSData,但这与其定义冲突。
NEVPNProtocolIPSec::sharedSecretReference定义为:
对包含IKE共享密钥的密钥链项的永久密钥链引用。
您需要创建一个kSecClassGenericPassword类型的密钥链项作为共享密钥,并为该密钥链项提供一个持久引用。持久引用在这里至关重要,因为它可以存储到磁盘或在进程之间传递,这是NEVPNManager访问共享密钥和连接您的虚拟专用网络所必需的。我怀疑,尽管passwordReference似乎是由密钥链项设置的,但它可能也不会返回持久引用。
您需要使用具有返回类型kSecReturnPersistentRef的SecItemCopyMatching来实现这一点。
https://stackoverflow.com/questions/50335351
复制相似问题