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 を構成したいと考えています。どうすればいいですか?