与NEVPNProtocolIKEv2的VPN连接-ios/swift

与NEVPNProtocolIKEv2的VPN连接-ios/swift,swift,certificate,vpn,pkcs#12,Swift,Certificate,Vpn,Pkcs#12,我必须使用证书与协议IKEv2建立VPN连接。 我已经有了网络扩展的权利 从我正在使用的证书开始: 我使用ACS请求请求该证书,该请求返回我需要通过VPN连接发送的Base64中的UserCertificate 收到Base64中的用户证书示例: "MIIFqTCCA5GgAwIBAgIQdwPEs5oyDHNNp7e2ZyhwADANBgkqhkiG9w0 ... N972fR4pncgdIA==" 为了在“identityData”参数中传递该证书,我必须将其转换为PKCS12格式的数据。

我必须使用证书与协议IKEv2建立VPN连接。 我已经有了网络扩展的权利

从我正在使用的证书开始: 我使用ACS请求请求该证书,该请求返回我需要通过VPN连接发送的Base64中的UserCertificate

收到Base64中的用户证书示例:

"MIIFqTCCA5GgAwIBAgIQdwPEs5oyDHNNp7e2ZyhwADANBgkqhkiG9w0 ... N972fR4pncgdIA=="
为了在“identityData”参数中传递该证书,我必须将其转换为PKCS12格式的数据。 这是我从Base64到数据的转换:

certificate = SecCertificateCreateWithData(nil, Data(base64Encoded: "Base64_String_Here")! as CFData)!

certificateData = SecCertificateCopyData(certificate!) as Data
我能够将数据打印为NSData,得到以下示例:

308205a9 30820391 a0030201 02021077 03c4b39a 320c734d a7b7b667 28700030 0d06092a 864886f7 0d01010b 05003060
311c301a 06035504 030c1354 45535420 5646435a 20455043 20537562 4341310c 300a0603 55040b0c 03455043 31253023
06035504 0a0c1c56 6f646166 6f6e6520 437a6563 68205265 7075626c 69632061 2e732e31 0b300906 03550406 1302435a
301e170d 31373131 31373131 32393531 5a170d31 39313131 38313132 3935315a 30818731 43304106 03550403 0c3a3467
66693233 30303339 39303030 30313433 31403467 66692e65 70632e6d 6e633030 332e6d63 63323330 2e336770 706e6574
776f726b 2e6f7267 310c300a 06035504 0b0c0345 50433125 30230603 55040a0c 1c566f64 61666f6e 6520437a 65636820
52657075 626c6963 20612e73 2e310b30 09060355 04061302 435a3082 0122300d 06092a86 4886f70d 01010105 00038201
0f003082 010a0282 010100cc 5effc8d7 fb357559 678fb8fc 48fd3558 8af4f236 a27295a6 b484bad0 921f8077 35ddbceb
5c064492 2f9df462 2a44c4fc 85b80cfa eec6b84b b13aefa1 69e4e6b3 db8ef30b 202229c7 421bfb8f 3f47c24f 6e3f7abc
ca7d216b 31d2a02c 94c3ef6c 9d50c2ab a590d99f 5d7afddb acbcc045 53949653 97034063 404cbe00 6aaec239 b37b2ce9
5c63d126 127247a5 75446c6b fa2e2217 6706a36c a0db0630 dac90d10 00ff24a8 2f189f18 37233151 f9825f60 aa8f66e7
89d656b9 5a52d9e3 b52cb3bc 5badb801 d9ea3685 8930cb3b 490ccba0 247f4bde 00b46d5e a63b1018 4ad8a581 978f5570
82f06f7f ba60db83 abcb4391 2f221e69 14bbdc46 ce19ae95 33773f02 03010001 a3820135 30820131 30370608 2b060105
05070101 042b3029 30270608 2b060105 05073001 861b6874 74703a2f 2f6f6373 702d6570 632e766f 6461666f 6e652e63
7a301d06 03551d0e 04160414 ea45a2e8 94fe37bc 08af3fab 60f9869b 5980d3cf 30090603 551d1304 02300030 1f060355
1d230418 30168014 f3c6b0f4 961565ab 232c6060 3e16f790 f63334b1 30440603 551d2004 3d303b30 39060960 86480186
f8420108 302c302a 06082b06 01050507 0201161e 68747470 3a2f2f70 6b692e76 6f646166 6f6e652e 637a2f70 6f6c6963
792f3040 0603551d 1f043930 373035a0 33a03186 2f687474 703a2f2f 706b692e 766f6461 666f6e65 2e637a2f 63726c2f
74657374 5f766663 7a5f6570 635f6361 2e63726c 300e0603 551d0f01 01ff0404 030203f8 30130603 551d2504 0c300a06
082b0601 05050703 02300d06 092a8648 86f70d01 010b0500 03820201 004cacde 1d7b7843 43aa546c 8984e308 57a12a27
0b9a2873 2adb598d da29fe4c ee087c92 3f18bbaa 1f3ef0b9 39e18d50 db982f87 36689c03 07ab7d11 a1665bf0 f6057de5
e89fe2fe 3f9c476b 8a28749c f9d7636c 8ece6012 d0a53902 ec437171 0af85024 0963bf85 518fa150 43dc7fe8 30c42f09
62cd2a31 c38e54ba de2b8a01 6e6804b2 b66c36c1 4626fc37 65064a65 d5087412 8e541e12 51525c4c e1f4a7e2 94a31397
2806d327 7a3c65c7 50e7db59 99460ae9 a446391e 5bbce05e 1f205e1c 118cd7aa 02e9881f 75b5b40d f2aa09bc bb7abf22
b11b3e31 2f0e78ae ee497d26 ef314b1d f16008af c433a653 983db0a9 97cbbca1 5a9e8d4d 3d34ee87 858e4f3d d2c5c111
05ccdcfa b1a41afe 2624ba31 decd561a 791e97e0 197b8bfe 97ebb3ad 7b511c1d e820c83f 81cdb9ed 21d59b49 7fb0bb39
69e735e7 350af763 ab26ee3d 7e954ef7 e5c994f6 c8f104ac 4f19ed25 9855f14c 619935d6 0d9f1206 910ffe03 74c312d5
b39da039 650d9004 e2186914 cfa19052 a2e47f1c 5af90903 959ab99f 2c52a9d8 f737b59f 00cababa 0b4f7236 e9102ee4
a76ed0a0 6d827860 653d6e62 f52fcc77 d9afdc90 53d942fe 434c8901 ab2a93e8 cc7c8555 eb6a94e5 0e1cc18c 9d6c8b48
ed9204eb 623f74d2 219a5ca9 032caa7c 900ed208 b88f5fb2 5c53bcd3 e82c48f8 80450f40 f05706c1 072427cb 815e8590
4fbf5137 def67d1e 299dc81d 20
基本上,var certificateData就是我在参数“identityData”中使用的数据

以下是我为连接VPN所做的操作:

首先,我设置了所需的所有参数:

vpnManager = NEVPNManager.shared()


vpnManager!.loadFromPreferences { error in

     var hasProtocolConfig = false;

     if #available(iOS 9, *) {
          hasProtocolConfig = self.vpnManager!.protocolConfiguration != nil
     } else {

hasProtocolConfig = self.vpnManager!.`protocol` != nil
     }

     if hasProtocolConfig == true {

          let p = NEVPNProtocolIKEv2()

          p.serverAddress = "X.X.X.X"
          p.localIdentifier = "My_Local_Identifier"
          p.remoteIdentifier = "My_Remote_Identifier"
          p.identityData = certificateData          

          p.ikeSecurityAssociationParameters.integrityAlgorithm = NEVPNIKEv2IntegrityAlgorithm.SHA256
          p.ikeSecurityAssociationParameters.encryptionAlgorithm = NEVPNIKEv2EncryptionAlgorithm.algorithmAES128
          p.ikeSecurityAssociationParameters.diffieHellmanGroup = NEVPNIKEv2DiffieHellmanGroup.group14

          p.serverCertificateIssuerCommonName = "My_IssuerCommonName"
          p.serverCertificateCommonName = "My_CommonName"
          p.authenticationMethod = NEVPNIKEAuthenticationMethod.certificate
          p.useExtendedAuthentication = true

          p.disconnectOnSleep = false

          if #available(iOS 9, *) {
               self.vpnManager.protocolConfiguration = p
          } else {
               self.vpnManager.`protocol` = p
          }

          self.vpnManager.isEnabled = true

          self.vpnManager.saveToPreferences { error in

          if let e = error{
              print("[VPN] error saving: " + e.localizedDescription)
          } else {
              print("[VPN] vpn saved")
              Timer.scheduledTimer(timeInterval: 5, target: self, selector: #selector(self.connectVPN), userInfo: nil, repeats: false)
          }

          return
}
然后我建立VPN连接:

do {
     try vpnManager!.connection.startVPNTunnel()
} catch let error {
     print("Error starting VPN Connection \(error.localizedDescription)");
}
如果我理解得很好,因为我无法强制“Notify:EAP_ONLY_认证”,我必须使用“NEVPNIKEAuthentication.certificate”,否则我可以将其设置为“.none”

IkeAsociationParameters是正确的,我与服务器端进行了检查

当我尝试连接到VPN时,我会获得以下状态: 连接->断开


你知道我在这个连接上做错了什么吗?

嘿,你有没有关于如何为NEVPNProtocolIKEv2协议添加证书的解决方案?对不起,没有。在我的例子中,客户端VPN不支持iOS,他们过了一段时间才发现…@Pincha,我有一个类似的问题。首先连接,然后立即断开。我如何在专家的后端发现他的服务器不支持ios?我必须回答他什么?