0

Ainsi,La protection des données liées à l'authentification lors du déplacement du HttpURLConnection au HttpsURLConnection

J'ai ici application Java SE 8.

Plate-forme: IntelliJ et Mac OS.

Je m'authentifie avec l'application Web Microsoft SharePoint sur sa page d'accueil en utilisant le schéma d'authentification NTLM. Je fais cela en utilisant l'API de réseau Core Java. J'ai essayé d'autres bibliothèques, comme celles d'Apache, mais en quelque sorte l'authentification ne réussit qu'avec les méthodes Core Java.

Bon, ici il vient code auth, qui fonctionne:

CookieHandler.setDefault(new CookieManager(null, CookiePolicy.ACCEPT_ALL)); 

    final String authHost = "http://domainSample.com/one/two"; 

     Authenticator.setDefault(new Authenticator() { 
      @Override 
      public PasswordAuthentication getPasswordAuthentication() { 
       return new PasswordAuthentication(
        clientAuth.getUserAdmin() , clientAuth.getPassword().toCharArray()); 
      } 
     }); 

     URL URLAuth = new URL(authHost); 
     HttpURLConnection conn = (HttpURLConnection) URLAuth.openConnection(); 
     conn.setDoOutput(true); 
     conn.setDoInput(true); 

     conn.setRequestMethod("GET"); 
     conn.setRequestProperty("Accept", "*/*"); 
     conn.setUseCaches(false); 

     conn.connect(); 

Les en-têtes sur l'objet conn sur la réponse:

{null=[HTTP/1.1 200 OK], SPIisLatency=[0], Server=[Microsoft-IIS/8.5], X-Content-Type-Options=[nosniff], Persistent-Auth=[true], Last-Modified=[Tue, 27 Jun 2017 16:37:41 GMT], X-FRAME-OPTIONS=[SAMEORIGIN], request-id=[74c9ff9d-4d14-0038-1c59-424a812a2885], Date=[Tue, 27 Jun 2017 16:37:40 GMT], MicrosoftSharePointTeamServices=[15.0.0.4911], X-MS-InvokeApp=[1; RequireReadOnly], SPRequestGuid=[74c9ff9d-4d14-0038-1c59-424a812a2885], Cache-Control=[private, max-age=0], SPRequestDuration=[94], X-AspNet-Version=[4.0.30319], Expires=[Mon, 12 Jun 2017 16:37:41 GMT], Content-Length=[161234], X-Powered-By=[ASP.NET], X-SharePointHealthScore=[0], Content-Type=[text/html; charset=utf-8]} 

Maintenant, le code ci-dessus authentifié l'application, le client, avec le système distant. Maintenant, je veux communiquer avec le service de type REST sur le même système, afin d'obtenir une réponse à la demande de service.

L'URL devient ceci:

final String urlService = "https://domainSample.com/api/birds/getAllBirds"; 

Le code correspondant est ici:

URL URLService = new URL(urlService); 
      HttpsURLConnection conns = (HttpsURLConnection)URLService.openConnection(); 
      conns.setDoOutput(true); 
      conns.setDoInput(true); 

      conns.setRequestMethod("POST"); 
      conns.setRequestProperty("Accept", "*/*"); 
conns.setChunkedStreamingMode(0); 
      conns.connect(); 

De toute évidence, je reçois en réponse le:

HTTP 401 : Unauthorized 

Parce que je suis une nouvelle objet de connexion, qui est maintenant basé HTTPS.

Le système utilise un certificat de sécurité personnalisé, que j'ai ajouté auparavant au fichier de clés sur le JRE. Donc, je veux conserver les données d'authentification et les transférer sur l'objet HttpsURLConnection. Alors que j'effectue l'authentification au tout début du processus, puis continuer avec plusieurs appels sur le système de service réel. Maintenant, quand vous regardez les en-têtes, qui viennent en réponse à une authentification réussie (HTTP 200), je n'y vois rien d'utile que je pourrais réutiliser pour un tel cas d'utilisation. Par exemple, je ne reçois même pas un Cookie.

J'ai essayé le URLConnection au lieu de l'objet HttpURLConnection lors de l'authentification, mais aucun cookie entre en jeu. Je utiliser relevent paires clé-valeur de cookies pour me identifier comme déjà authentifié et le transmettre à chaque demande ultérieure.

En ce qui concerne les en-têtes en réponse, ils ont quelque chose appelé:

  • demande-id
  • SPRequestGuid

qui ressemblent à des identifiants uniques, qui ne servait à rien de les transmettre avec la demande suivante.

Alors,

Qu'en pensez-vous?

Répondre

0

Il est tout à fait possible que toute session initiée sur http ne puisse simplement pas être transférée vers https. Le serveur peut voir que la nouvelle connexion est https et peut simplement refuser de l'associer à un jeton de session existant identifié par http. En fait, cela serait probablement considéré comme un défaut de sécurité s'il le faisait. Les sessions Https nécessitent généralement que la connexion soit cryptée en premier, avant toute authentification, afin que les détails d'authentification ne puissent pas être interceptés. En d'autres termes, l'authentification sur https ne peut être lancée qu'après la création de la connexion, pour qu'elle soit sécurisée.

En ce qui concerne vos questions sur le suivi de session, les sessions sont généralement suivies avec des identifiants de session. Les identifiants de session sont suivis avec des cookies ou des en-têtes http, et en fait vous devrez ajouter l'ID de session à toute autre connexion de la même machine (soit dans l'URL d'une requête GET, soit dans les en-têtes pour POST). Si vous ne le faites pas, vous créez probablement une nouvelle session pour chaque requête http unique. Si vous réussissez à renvoyer l'ID de session correctement, il peut être invalidé par le serveur si le serveur voit une requête avec le même identifiant provenant d'un navigateur différent ou d'une adresse IP différente.

Même si vous parvenez à maintenir une session à travers plusieurs demandes dans votre code, vous ne pouvez probablement pas transférer cette session à https, pour les raisons indiquées ci-dessus, je suppose qu'aucun serveur Web ne l'autoriserait.