HTTPS, certificat d'un NAS Synology en Swift

iosciosc Membre
octobre 2016 modifié dans API UIKit #1

Bonjour à  toutes et à  tous,


 


Jeune développeur en swift 3, je suis entrain de développer ma première application pour iOS que je compte déployer sur l'App Store.


Mon application, à  destination des utilisateurs de NAS Synology, est développée sur la base de l'API REST du constructeur. 


 


Je suis actuellement coincé sur la connexion en HTTPS au NAS (essai de développement sur mon propre NAS en local). En effet, je me confronte au problème lié à  l'ATS mis en place depuis iOS9.


Lors de ma tentative d'accès au NAS en HTTPS, mon appli renvoi une erreur:


 


"The certificate for this server is invalid. You might be connecting to a server that is pretending to be “192.168.0.xx” which could put your confidential information at risk."


 


Je cherche une solution pour pouvoir poursuivre mon développement en utilisant une connexion HTTPS sur un NAS Synology (donc un serveur avec un certificat auto-signé), que ce soit évidemment pendant ma phase de développement sur mon NAS perso, mais surtout que cela soit viable également lors du déploiement de l'application (afin que l'utilisateur n'ait pas à  se soucier de ça) et donc que cela soit validé par Apple.


 


Pour information, je suis entrain de modeler mon code, donc voici avec quoi je travaille pour le moment pour faire mes tests (mais évidemment, cela n'est qu'une ébauche de mon modèle de connexion) :



let network_config = URLSessionConfiguration.default
let network_session = URLSession(configuration: network_config)
let request_url = URL(string: "https://192.168.0.xx:PORT/url liée à  l'API  ")!
         
let network_request = network_session.dataTask(with: request_url, completionHandler: { (data, response, error) in
     if error != nil {
         print(error!.localizedDescription)
     } else {
         print("debug : works")
     }
  })
         
  network_request.resume()

Un grand merci d'avance pour votre aide


 

 

 

Réponses

  • Bonsoir, d'après cet article ATS n'accepte pas les certificats auto-signés. Dans ton il semblerait que la solution doit de désactiver ATS et de signaler à  URLSession d'accepter ce type de certificats.


  • iosciosc Membre
    octobre 2016 modifié #3

    Bonsoir Lexxis,

    Merci pour ta réponse, mais en desactivant l'ATS et en forçant les certificats auto-signés, mon app ne passera jamais la validation pour l'appstore, non?


  •  

    En attendant la réponse de l'un de vous quant à  la validité de cette desactivation vis à  vis de l'appstore, j'ai passé en revu des dizaines et des dizaines de solution pour désactiver l'ATS et faire passer une connexion sur un serveur au certificat auto-signé, et je n'ai pas réussi à  mettre en place les différentes méthodes.


     


    Un coup de main sur ceci également serait super apprécié.


    Merci encore.


  • Il y a une clé à  mettre dans ton fichier info.plist pour désactiver ATS.

    Il faut lire ici :

    https://developer.apple.com/library/content/documentation/General/Reference/InfoPlistKeyReference/Articles/CocoaKeys.html#//apple_ref/doc/uid/TP40009251-SW33

    Dans ios 10, il y a une option pour désactiver ATS pour les connections au réseau local : NSAllowsLocalNetworking.
  •  

    Bonjour FKDEV, merci pour ta réponse.


     


    J'avais déja ajouté la clé NSAllowsArbitraryLoads - je viens d'essayer avec NSAllowsLocalNetworking.


    Toujours pareil, rien ne passe en https. Il faut vraiment que je trouve une solution, et pour mes tests pendant la phase de développement, mais surtout pour que cela soit viable et fonctionnel avec les futurs utilisateurs de mon app et que celle-ci soit validée par Apple


     


    Pour information, dans la console, je peux lire


    NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9813)


    The certificate for this server is invalid. You might be connecting to a server that is pretending to be “192.168.0.xx” which could put your confidential information at risk.


     


    Je ne trouve aucune solution qui fonctionne dans mon cas., sur stackoverflow entre autre...


  •  

    Re,


    J'ai enfin pu faire passer ma requête en https - avec cette méthode, je n'ai pas besoin de clé pour désactiver l'ATS dans le fichier plist.


    Maintenant, je suis encore entrain de décortiquer cela pour bien l'assimiler et le comprendre, mais j'apprécierai vraiment si vous pouviez me donner votre avis sur l'efficacité en production de ce code, et encore une fois, si ce genre de méthode ne risque pas de voir l'application refusée sur l'appstore ?


     


    Merci encore d'avance.



    typealias CompletionModel = ([String:Any], Error?) -> Void
    func connection(api: String, params: [String: Any], method: String, onComplete: @escaping CompletionModel) {

        let network_config = URLSessionConfiguration.default
        let network_session = URLSession(configuration: network_config, delegate: self, delegateQueue: OperationQueue.main)

        let request_url = URL(string: "https://192.168.0.5:5001/....")!
         
        let network_request = network_session.dataTask(with: request_url, completionHandler: { (data, response, error) in
           if error != nil {
               print(error!.localizedDescription)
           } else {
               print("debug : worked!")
           }
         
        })
         
        network_request.resume()
        
    }

    func urlSession(_ session: URLSession, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) {

        if challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust
        {
            if challenge.protectionSpace.host == "192.168.0.5"
            {
                let credentials = URLCredential(trust: challenge.protectionSpace.serverTrust!)
                challenge.sender?.use(credentials, for: challenge)
                completionHandler(URLSession.AuthChallengeDisposition.useCredential,credentials);
            }
        }
    }

     

     

  •  

    Personnes sur le sujet ?


  • Mon client a normalement une app sur le store avec l'ATS ouvert à  tout.



    Après, je ne sais pas vraiment ce que tu cherches à  savoir avec "efficacité en production de ce code".


  • iosciosc Membre
    novembre 2016 modifié #10

    Merci Larme pour ta réponse.


     


    Ma question, probablement mal formulée, au sujet de l'efficacité de mon code vient du fait que je me demande si cette méthode est "propre" ou si une autre solution plus adaptée serait préconisée. 


    Mon interrogation vient du fait que, partout sur internet, mes recherches sur ce sujet (self-signed certificates + https) m'ont amenées sur une unique solution : désactiver l'ATS via le fichier plist (cf. la réponse de FKDEV ci-dessus), or, ici, ma solution fonctionne très bien sans ces clés. 


     


    Je rappelle que je suis encore jeune dans le milieu du swift (et de la programmation iOS/MacOS).


    Merci encore :)


Connectez-vous ou Inscrivez-vous pour répondre.