【问题标题】:Connect to VPN ios8, persistent reference of password from keychain is null连接到VPN ios8,钥匙串中密码的持久引用为空
【发布时间】: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


【解决方案1】:

您必须先加载首选项,然后才能更改它们。确保运行 loadFromPreferencesWithCompletionHandler,然后创建您的协议并进行更新。

【讨论】:

  • 每当我从首选项加载配置文件并进行更改(例如更改主机地址并将其保存回首选项)时,它都会丢失对密码的引用。您对此有任何想法吗?
猜你喜欢
  • 1970-01-01
  • 2015-04-29
  • 2018-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-25
  • 2015-03-07
相关资源
最近更新 更多