我使用 NetworkExtension 框架来创建一个应用程序,它通过 NEVPNProtocolIKEv2 连接到 VPN 服务器。
经过研究,我找到了有关使用 NetworkExtension 框架的教程,并尝试遵循它。(http://ramezanpour.net/post/2014/08/03/configure-and-manage-vpn-connections-programmatically-in-ios-8/)
但是,当我配置这个协议的 identityData 时,我卡住了。这是m代码:
self.vpnManager.loadFromPreferencesWithCompletionHandler { [unowned self] (error) in
if error != nil {
printError("\(error?.errorDescription)")
return
}
let p = NEVPNProtocolIKEv2()
p.username = server.userName
p.serverAddress = server.serverUrl
// Get password persistent reference from keychain
self.createKeychainValue(server.password, forIdentifier: KeychainId_Password)
p.passwordReference = self.searchKeychainCopyMatching(KeychainId_Password)
p.authenticationMethod = NEVPNIKEAuthenticationMethod.None
self.createKeychainValue(kVPNsecret, forIdentifier: KeychainId_PSK)
p.sharedSecretReference = self.searchKeychainCopyMatching(KeychainId_PSK)
// certificate
p.identityData = ??????
p.useExtendedAuthentication = true
p.disconnectOnSleep = false
self.vpnManager.`protocol` = p
self.vpnManager.localizedDescription = server.serverName
self.vpnManager.saveToPreferencesWithCompletionHandler({ [unowned self] (error) in
if error != nil {
printError("Save config failed " + error!.localizedDescription)
}
})
}
在教程中,p.identityData 是从 P12 文件加载的 NSData。但我只有一个字符串调用:server.certificate
此 server.certificate 具有这样的值
"-----BEGIN CERTIFICATE-----\nMIIEdDCCA1ygAwIBAgIBADANBgkqhki......1iEtCZg7SAlsBiaxpJzpZm5C6OifUCkUfZNdPQ==\n-----END CERTIFICATE-----\n"
这是一个非常长的字符串,调用 x509Certificate... 或类似的东西,我不记得了。
我发现一个库支持将字符串写入文件 p12,它是“openssl”。
但是演示代码是Objective-C。我一直在尝试将此代码移植到 Swift,但这太难了。(演示代码:iOS:如何以编程方式从应用程序中的私钥和 x509 证书创建 PKCS12(P12)密钥库?)
最后,我只有一个字符串证书,我想为我的应用程序配置 p.identityData。我怎么做?