[iOS] Sécurité – PIN certificate SSL

lundi 30 janvier 2017

Nous allons voir ici comment contrer les attaques de type MITM (man in the middle) au niveau sécurité mobile.

Pour ce point Alamofire propose plusieurs solutions et en parle sur leur github ici

L’objectif est d’empêcher de by passer le controle du certificat SSL entre l’application et le serveur.
Pour cela, nous allons donc dans l’application vérifier pour chaque nom de domaine qu’on interroge via webservices si on a un certificat dans l’application qui correspond à celui sur le serveur.

Alamofire dispose de la fonction ServerTrustPolicy.certificatesInBundle() qui se charge de rechercher dans le bundle tous les certificats disponibles pour les comparer avec celui sur le serveur.
Il vérifie les extensions cer/der/crt et ensuite teste si on sait lire son contenu qui doit absolument être un certificat au format DER-encoded X.509 certificate!

Pour ma part j’ai du demander les certificats des serveurs et je les aies convertit via la commande suivante:

openssl x509 -outform der -in certificate.pem -out certificate.der

On peut aussi imposer nous même les certificats pour chaque host de webservice mais pas très avantageux car il est très utile d’avoir deux certificats dans l’application le courant et le ssl à venir. Ce qui permet d’anticiper des problèmes d’expiration de certificats.

Voici l’attribut de ma classe qui gère le paramétrage d’Alamofire (manager)

    private var manager : Alamofire.Manager = {
        // NEW CERTIFICAT DER-encoded X.509 !! in the bundle
        let certificates = ServerTrustPolicy.certificatesInBundle()
        let serverTrustPolicies: [String: ServerTrustPolicy] = [
            AppConstants.Settings.Defaults.devEnvironmentDomainName : .PinCertificates(
            certificates: certificates,
            validateCertificateChain: true,
            validateHost: true
            ),
            AppConstants.Settings.Defaults.prodEnvironmentDomainName: .PinCertificates(
                certificates: certificates,
                validateCertificateChain: true,
                validateHost: true
            )
        ]
        // Create security Alamofire manager
        let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
        configuration.HTTPAdditionalHeaders = Alamofire.Manager.defaultHTTPHeaders
        let config = NSURLSessionConfiguration.defaultSessionConfiguration()
        config.URLCache = nil
        config.requestCachePolicy = NSURLRequestCachePolicy.ReloadIgnoringLocalCacheData
        let man = Alamofire.Manager(
            configuration: config,
            serverTrustPolicyManager: ServerTrustPolicyManager(policies: serverTrustPolicies)
        )
        return man
    }()

Je me suis inspiré de cet article intéressant

Tags: Alamofire , IOS , sécurité , SSL