IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Entrée/Sortie Java Discussion :

Lancer une requête HTTPS avec certificat PEM et login/mot de passe


Sujet :

Entrée/Sortie Java

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2011
    Messages
    192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Transports

    Informations forums :
    Inscription : Février 2011
    Messages : 192
    Points : 107
    Points
    107
    Par défaut Lancer une requête HTTPS avec certificat PEM et login/mot de passe
    Bonjour,

    je suis en pleine recherche pour réussir à envoyer des requêtes https à une camera IP.
    Sur cette dernière, j'ai pu créer un certificat auto signé que j'ai récupérer au format PEM.

    Je voudrais tout simplement lui adressé une requête de ce type :
    https://10.10.10.10/axis-cgi/pwdgrp....iewer&comment=''

    je dois aussi m'identifier avec login et mot de passe, je pense que cette partie est OK, je procède de la manière suivante (qui marche parfaitement avec HTTP) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    String userPassword = Config.getProperty("login") + ":" + Config.getProperty("pwd");
    String encoding = new BASE64Encoder().encode (userPassword.getBytes());
    uc.setRequestProperty ("Authorization", "Basic " + encoding);
    Mon problème se situe donc au passage du certificat ainsi qu'au lancement de ma requête https.

    j'ai testé pas mal de choses tournant autour de ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    String str = "https://" + ipCamera + "/axis-cgi/pwdgrp.cgi?action=add&user=zobi&pwd=zob&grp=users&sgrp=viewer&comment=''";
     
    HttpsURLConnection uc =(HttpsURLConnection) new URL(str).openConnection();
    uc.setDoOutput(true);
    uc.setRequestMethod("POST");
    je me suis renseigné sur TrustManager ...

    mais pour le moment je galère et n'arrive pas à tout faire fonctionner ensemble..

    si quelqu'un peu m'apporter de l'aide ça serait bien aimable ! ou tout simplement me rediriger sur une page ou quelque chose. J'ai pas mal chercher mais toutes mes tentatives se sont révélées infructueuses..

    Merci d'avance

    dumoulex

  2. #2
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    Il suffit de définir un "HostnameVerifier" qui se chargera de vérifier et d’autoriser le "nom de domaine" par rapport au certificat. Par exemple en acceptant "tout le monde" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    	uc.setHostnameVerifier(new HostnameVerifier() {
    		@Override
    		public boolean verify(String hostname, SSLSession session) {
    			return true;
    		}
    	});

    Ca revient en quelques sortes à ignorer l'identification du domaine du certificat. Attention car du coup rien ne garantie l'identité de la source, ce qui pourrait être problématique si on utilise ceci avec n'importe quelle adresse HTTPS...

    Mais dans ton cas précis ce ne doit pas être un problème


    a++

  3. #3
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2011
    Messages
    192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Transports

    Informations forums :
    Inscription : Février 2011
    Messages : 192
    Points : 107
    Points
    107
    Par défaut
    tout d'abord merci de ta réponse,

    je vois le principe de ton code, je dois y rajouter quelques infos mais je comprends le principe.
    En restant avec le return true
    l'acceptation du certificat est donc 'automatique'. Mais je vois mal comment il est appelé..


    Voici le code que j'ai, mais qui ne marche pas encore... (sans les try catch)

    le but étant d'avoir un nouvel utilisateur nommé 'zobi' pour ma caméra IP 10.10.10.10
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
     
    /* url a joindre */
    String httpsURL = "https://10.1.10.10/axis-cgi/pwdgrp.cgi?action=add&user=zobi&pwd=zob&grp=users&sgrp=viewer&comment=''";
     
    /* creation de l'url */
    URL myurl = new URL(httpsURL);
    /* ouverture de la connexion */
    HttpsURLConnection con = (HttpsURLConnection) myurl.openConnection();
     
    /* authentification */
    String authentication = "root" + ":" + "ctb";
    String encodedPassword = "Basic " + new sun.misc.BASE64Encoder().encode(authentication.getBytes());
    con.setRequestProperty("Authorization", encodedPassword);
     
    /* pour l'acceptation du certificat */
    con.setHostnameVerifier(new HostnameVerifier() {
    	public boolean verify(String arg0, SSLSession arg1) {
        		return true;
        	}
    });
     
    con.connect();
    je me fous du résultat retour donc pas besoin d'inputStream, je sais que le résultat est OK quand l'utilisateur zobi est ajouté à la liste des utilisateurs, ce qui ne marche pas.

    Ça marche très bien avec http, mais en passant en https, d'utiliser HttpsURLConnection et le certificat, il y a quelque chose qui cloche, des exceptions sont levées lors du connect().

    Sûrement que je manque une étape mais laquelle..

    Merci en tout cas pour ton aide

  4. #4
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par dumoulex Voir le message
    l'acceptation du certificat est donc 'automatique'. Mais je vois mal comment il est appelé..
    Ben c'est HttpsURLConnection qui se charge de cela...

    Citation Envoyé par dumoulex Voir le message
    je me fous du résultat retour donc pas besoin d'inputStream,
    Je ne sais pas si c'est très propre par rapport au protocol HTTP.
    Je pense qu'il faudrait quand même que tu récupères ce résultat même si tu ne le lis pas...

    Citation Envoyé par dumoulex Voir le message
    Ça marche très bien avec http, mais en passant en https, d'utiliser HttpsURLConnection et le certificat, il y a quelque chose qui cloche, des exceptions sont levées lors du connect().
    Quelles exceptions ???

    a++

  5. #5
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2011
    Messages
    192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Transports

    Informations forums :
    Inscription : Février 2011
    Messages : 192
    Points : 107
    Points
    107
    Par défaut
    voici l'exception levée lors du connect() :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
     
    erreur IOException lors de con.connect()
     
    javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    	at sun.security.ssl.Alerts.getSSLException(Alerts.java:192)
    	at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1665)
    	at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:258)
    	at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:252)
    	at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1165)
    	at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:154)
    	at sun.security.ssl.Handshaker.processLoop(Handshaker.java:610)
    	at sun.security.ssl.Handshaker.process_record(Handshaker.java:546)
    	at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:913)
    	at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1158)
    	at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1185)
    	at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1169)
    	at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:440)
    	at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185)
    	at sun.net.www.protocol.https.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java:153)
    	at murEcran.APICamera.APICamera.ouiii(APICamera.java:418)
    	at murEcran.APICamera.APICamera.ordreAutoriserFlux(APICamera.java:360)
    	at regulation.RegulationAction.autoriserFluxPopup(RegulationAction.java:787)
    	at regulation.RegulationAction.autoriserFluxPopup(RegulationAction.java:721)
    	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    	at java.lang.reflect.Method.invoke(Method.java:616)
    	at org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java:276)
    	at org.apache.struts.actions.DispatchAction.execute(DispatchAction.java:196)
    	at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:421)
    	at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:226)
    	at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1164)
    	at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:397)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:740)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:199)
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:145)
    	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:210)
    	at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:596)
    	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:433)
    	at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:955)
    	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:139)
    	at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:596)
    	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:433)
    	at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:955)
    	at org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2460)
    	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:133)
    	at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:596)
    	at org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.java:119)
    	at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:594)
    	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
    	at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:594)
    	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:433)
    	at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:955)
    	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:127)
    	at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:596)
    	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:433)
    	at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:955)
    	at org.apache.coyote.tomcat4.CoyoteAdapter.service(CoyoteAdapter.java:157)
    	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:875)
    	at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
    	at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
    	at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
    	at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689)
    	at java.lang.Thread.run(Thread.java:679)
    dans cette erreur, je comprend qu'il ne trouve pas le chemin du certificat, mais je ne lui précise même pas, ce qui doit déjà être une erreur, sinon le code contenant le HostnameVerifier() n'est pas censé renvoyer True dans tous les cas ?

    pour le retour avec inputStream, tu as raison, je le lis quand même mais je me fout de ce qu'il retourne pour le moment, je le récupérerai quand même pour faire propre.

    merci encore !

  6. #6
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par dumoulex Voir le message
    dans cette erreur, je comprend qu'il ne trouve pas le chemin du certificat, mais je ne lui précise même pas, ce qui doit déjà être une erreur,
    Le principe des certificats consiste à vérifier l'identité du certificat, en remontant dans les autorités de certifications jusqu'à avoir un source fiable.

    Ce qui n'est pas possible avec ton certificat auto-généré...

    Plus d'info là dessus ici : http://www.developpez.net/forums/d92...th-to-request/


    Citation Envoyé par dumoulex Voir le message
    sinon le code contenant le HostnameVerifier() n'est pas censé renvoyer True dans tous les cas ?
    En fait c'est un autre problème d'un certificat utilisé avec un nom de domaine différent. Comme tu ne précisais pas d'exception j'ai pensé à cela...



    a++

  7. #7
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2011
    Messages
    192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Transports

    Informations forums :
    Inscription : Février 2011
    Messages : 192
    Points : 107
    Points
    107
    Par défaut
    merci des ces infos, je vais essayer d'avancer, je suis tombé sur ton lien dans l'après midi, je vais me pencher dessus !

    je noterai l'avance et les solutions que je trouve.

    merci

    ++

  8. #8
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2011
    Messages
    192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Transports

    Informations forums :
    Inscription : Février 2011
    Messages : 192
    Points : 107
    Points
    107
    Par défaut
    heyo,

    mon problème est réglé (pour le moment, acceptation du certificat comme un goret sans aucune vérification)

    voir http://www.java-samples.com/showtuto...tutorialid=211

    maintenant il faut que je passe à l'authentification du certificat..

  9. #9
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    765
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 765
    Points : 1 036
    Points
    1 036
    Par défaut
    Tu peux utiliser des versions d’évaluation de certificat gratuitement, tous les CA en proposent.

    Ca te permettra au moins de tester ton code.

  10. #10
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2011
    Messages
    192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Transports

    Informations forums :
    Inscription : Février 2011
    Messages : 192
    Points : 107
    Points
    107
    Par défaut
    En fait j'ai un gros problème !

    Je vous explique : pour le moment, j'utilisais un cert auto signé pour mes tests, mais maintenant la donne a changée :

    je souhaite (si vous n'aviez pas compris ) pouvoir joindre DES caméras en https pour leurs ajouter des utilisateurs à la volée.

    Le problème, c'est que je dispose de beaucoup de caméras, donc je crois que l'idée de mettre un vrai certificat en place va être tendue..Sur le principe je comprend qu'il me faudrait un certificat par caméra (arrêtez moi si je me trompe).
    Donc dans ce cas, je risque de rester avec des certificats auto signés, parce que vu le nombre de caméras, ça risque de faire cher !

    donc je voudrais trouver comment faire pour "tester" mon certificat auto signé (parce que quasi toutes les infos que je trouve sur le net sont sur des fonctions du genre "j'accepte tout" comme celle dont je dispose.

    merci pour l'aide apportée

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [WM20] Réaliser une requête http avec certificat sur iOS
    Par law56100 dans le forum Windev Mobile
    Réponses: 0
    Dernier message: 28/04/2015, 11h50
  2. [WM19] Requête https avec certificats
    Par law56100 dans le forum Windev Mobile
    Réponses: 0
    Dernier message: 06/01/2015, 15h34
  3. Lancer une requête sql avec sql plus sous dos
    Par feragne dans le forum Sql*Plus
    Réponses: 12
    Dernier message: 15/10/2008, 14h49
  4. Faire une requête https avec une application Delphi 7
    Par davidkungfu dans le forum Web & réseau
    Réponses: 12
    Dernier message: 10/04/2008, 10h39
  5. [HTTP C++] Comment lancer une requête HTTP en c++?
    Par ValyGator dans le forum Windows
    Réponses: 2
    Dernier message: 23/02/2008, 12h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo