【发布时间】:2014-12-05 18:41:54
【问题描述】:
我正在尝试使用 NETWORK EXTENSION 框架连接 vpn,但是在获取存储在钥匙串中的密码的持久引用时遇到了一些问题。它 [NSLog(@"password: %@", [manager protocol].passwordReference);] 在调用 [manager saveToPreferencesWithCompletionHandler:^(NSError *error) {...} 后返回 null 但是当我在调用 saveToPreferencesWithCompletionHandler 之前尝试登录时,它在钥匙串中给了我一个有效的参考。当我使用此代码块时,它会获取我存储在钥匙串中以供持久参考的所有详细信息。
NSDictionary *query = @{ (__bridge id)kSecValuePersistentRef: (__bridge NSData *)(KeychainUserPass.passwordPersistentReference),
(__bridge id)kSecReturnAttributes: (id)kCFBooleanTrue };
CFDictionaryRef passwordDict = nil;
OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef)query, (CFTypeRef*)&passwordDict);
NSLog(@"status: %ld, passwordDict: %@", status, (__bridge NSDictionary*)passwordDict);
NSLog(@"keychain password: %@", p.passwordReference);
但是为什么当我使用 NEVPNManager 类对象来存储密码参考时它没有得到任何细节?每当我尝试连接 vpn 而不是从钥匙串获取密码时,它都会提示我输入密码?
代码如下:
NEVPNProtocolIKEv2 *p = [[NEVPNProtocolIKEv2 alloc] init];
p.username = @"username";
p.passwordReference = (__bridge NSData *)(KeychainUserPass.passwordPersistentReference);
p.serverAddress = @"hostname";
p.authenticationMethod = NEVPNIKEAuthenticationMethodCertificate;
p.serverCertificateIssuerCommonName = @"Certificate Issuer name";
p.serverCertificateCommonName = @"Certificate name";
p.identityData = //p12;
p.identityDataPassword = @"password for p12";
p.localIdentifier = @"local identifier";
p.remoteIdentifier = @"remote identifier";
p.useExtendedAuthentication = YES;
p.disconnectOnSleep = NO;
[manager setProtocol:p];
[manager setOnDemandEnabled:YES];
[manager setLocalizedDescription:@"VPN Profile"];
[manager saveToPreferencesWithCompletionHandler:^(NSError *error) {
if(error) {
NSLog(@"Save error: %@", error);
}
else {
NSLog(@"Saved!");
NSLog(@"OnDemandEnable: %d", [manager isOnDemandEnabled]);
NSLog(@"onDemandRules: %@", [manager onDemandRules]);
NSLog(@"username: %@", [manager protocol].username);
NSLog(@"password: %@", [manager protocol].passwordReference);
}
}];
}
P.S:除了这个问题,一切正常。
【问题讨论】:
-
我遇到了同样的问题,在 iOS 9 上它可以工作,但在 iOS 8 上我遇到了你描述的同样的问题。你有没有发现这个问题或者它只是一个 iOS 错误?
-
唯一的问题是从钥匙串中保存/检索密码。您可以使用help from .. 您所要做的就是在从钥匙串获取数据后将结果集放入字典并使用“v_PersistentRef”键获取密码参考。
-
嘿,你能告诉我如何为 NEVPNProtocolIKEv2 协议添加证书吗?
标签: objective-c ios8 vpn keychain