Подключитесь к VPN с сертификатом - iOS / Swift

Я устанавливаю VPN-соединение, для аутентификации которого требуется сертификат.

В приведенном ниже коде показано, как я устанавливаю конфигурацию, которая требуется для VPN. Параметр identityData - это то место, где я помещаю свой сертификат как Data.

func setupVPN(){
guard let vpnManager = NEVPNManager.shared() else { return }

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()
        // All preferences here
        if let vpnData = self.vpnData {
        p.serverAddress = vpnData.getePDGAddress() // "X.X.X.X"
        p.localIdentifier = vpnData.getlocalIdentifier() // "[email protected]"
        p.remoteIdentifier = vpnData.getAPN() // "gggggg.uuuuuuuuuuu"
        p.identityData = vpnData.getUserCertificateData() // User Certificate as Data
        }

        p.ikeSecurityAssociationParameters.integrityAlgorithm = NEVPNIKEv2IntegrityAlgorithm.SHA256
        p.ikeSecurityAssociationParameters.encryptionAlgorithm = NEVPNIKEv2EncryptionAlgorithm.algorithmAES128
        p.ikeSecurityAssociationParameters.diffieHellmanGroup = NEVPNIKEv2DiffieHellmanGroup.group14
        p.serverCertificateIssuerCommonName = "TEST SubCA"
        p.serverCertificateCommonName = "TEST SubCA"
        p.authenticationMethod = NEVPNIKEAuthenticationMethod.certificate

        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
        }
    }
}

}

Один из примеров этого сертификата, закодированного в базе 64:

MIIFqTCCA5GgAwIBAgIQKLf5dlFRabt3cAe9ax2kXjANBgkqhkiG9w0BAQsFADBgMRwwGgYDVQQDDBNURVNUIFZGQ1ogRVBDIFN1Yk ... wdWJsaWMgYS5zLjELMAkGA1UEBhMCQ1owggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDNgTmc6uQ9Md

И затем синтаксический анализ данных выполняется следующим образом:

CaCertificateData = Data(base64Encoded: "Base64StringEncoded_Here")

Когда все настроено, я запускаю VPN-туннель следующим образом:

do {
 try vpnManager.connection.startVPNTunnel()
} catch let error {
     print("Error starting VPN Connection \(error.localizedDescription)");
}

Я вижу статус VPN, и VPN начинает подключение, а затем становится отключенным. 3 алгоритма, которые мы видим выше, верны.

Кто-то может заметить, что я делаю не так? У меня есть файлы .pcap из нескольких проведенных мною тестов. Во всех файлах .pcap я не отправляю обязательное сообщение «Client Hello». Думаю, проблема в сертификате.


person Pincha    schedule 31.10.2017    source источник
comment
Эй, у тебя есть какое-нибудь решение? Как подключиться с помощью аутентификации по сертификату? Coz Я могу подключиться с использованием пароля пользователя, но не с сертификатом. Не могли бы вы опубликовать свой ответ. это будет полезно и для других. Спасибо.   -  person Shrikant K    schedule 22.12.2017
comment
Привет, ты нашел какое-нибудь решение. У меня такая же проблема. Спасибо   -  person Yogendra Singh    schedule 03.08.2018
comment
Извините, но не. В моем случае это был клиентский VPN, который не поддерживает iOS, они выясняют спустя некоторое время ...   -  person Pincha    schedule 04.12.2018
comment
@ShrikantK, как ты это сделал?   -  person jarvis12    schedule 19.03.2019


Ответы (1)


вы можете использовать файлы .ovpn. Вы можете легко интегрировать сертификаты в файл ovpn. Посмотрите эту статью https://medium.com/better-programming/how-to-build-an-openvpn-client-on-ios-c8f927c11e80.

person swift2geek    schedule 19.03.2020
comment
Хотя теоретически это может дать ответ на вопрос, было бы предпочтительнее включить сюда основные части ответа и предоставить ссылку для справки. . - person M--; 20.03.2020