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

Services Web Java Discussion :

Connexion Java Client au Serveur HTTPS via proxy


Sujet :

Services Web Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Janvier 2005
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 74
    Par défaut Connexion Java Client au Serveur HTTPS via proxy
    Je suis entrain de developper un client java qui se connecte a une servlet (web service) en HTTPS / SSL , mon application passe par le proxy.

    Voilà le code :
    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
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
     
     
    package sslproject;
     
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.PrintWriter;
    import java.net.MalformedURLException;
    import java.net.URL;
    import javax.net.ssl.*;
    import java.security.KeyManagementException;
    import java.security.NoSuchAlgorithmException;
     
     
     
    public class HtpsConnection {
    	public static String urlHost ="https://X.X.X.X:443/PathServle";
     
    	public static void main (String[] args) throws IOException {
    		System.out.println(getPage(urlHost).toString());
    	}
     
    	public static StringBuffer getPage(String urlString)
    	{
       	public static String  proxyPwd = "proxyPWD";
    	public static String proxyUser = "proxyUSER";
    	public static String proxyHost = "proxyIP";
    	public static int    proxyPort = port_proxy;
     
            System.getProperties().put("javax.net.debug", "ssl" );
    	System.getProperties().put("https.proxySet", "true");
            System.getProperties().put("https.proxyHost", proxyHost);
            System.getProperties().put("https.proxyPort", proxyPort);
     
     
            TrustManager[] trustAllCerts = new TrustManager[]{
    			new X509TrustManager() {
    			public boolean checkClientTrusted(java.security.cert.X509Certificate[] chain){
    			return true;
    			}
    			public boolean isServerTrusted(java.security.cert.X509Certificate[] chain){
    			return true;
    			}
    			public boolean isClientTrusted(java.security.cert.X509Certificate[] chain){
    			return true;
    			}
    			public java.security.cert.X509Certificate[] getAcceptedIssuers() {
    			return null;
    			}
    			public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) {}
    			public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) {}
    			}
     
    		};
     
            try
            {
    	        SSLContext sc = SSLContext.getInstance("SSL");
    	        sc.init(null, trustAllCerts, null);
    	        HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
            }
            catch(NoSuchAlgorithmException nsae)
            {}
            catch(KeyManagementException kme)
            {
            	kme.printStackTrace();
            }
     
            try
    		{
    			HttpsURLConnection connec = null;
    			URL url = new URL(urlString);
    			connec = (HttpsURLConnection)url.openConnection();
    			connec.setDoInput(true);
                connec.setUseCaches(false);
     
                String authentication = proxyUser + ":" + proxyPwd;
                String encodedPassword = "Basic " + new sun.misc.BASE64Encoder().encode(authentication.getBytes());
                connec.setRequestProperty("Proxy-Authorization", encodedPassword);
                //connec.setRequestProperty("X-TestHeader", "value");
     
                connec.setRequestMethod("POST");
                connec.setDoOutput(true);
     
                String msg;
     
                msg= "---"+"\r\n";
     
                int statusCode = connec.getResponseCode();
     
                //System.err.println("Certificats  --->"+connec.getServerCertificates());
                System.err.println("HEADER --->"+connec.getHeaderFields());
     
                StringBuffer pageContents = new StringBuffer();
                if(statusCode==HttpsURLConnection.HTTP_OK)
                {
    				System.err.println("Connected ...!");
     
    				BufferedReader in = new BufferedReader(new InputStreamReader(connec.getInputStream()));
     
    				PrintWriter out = new PrintWriter(connec.getOutputStream(), true );
                	out.println(msg);
     
    				String curLine = in.readLine();
    				 while(curLine!=null)
    				 {
    					pageContents.append(curLine);
    					curLine = in.readLine();
    				 }
                }
                return pageContents;
    		}
    		catch(MalformedURLException mue)
    		{
    			mue.printStackTrace();
    		}
    		catch(IOException ioe)
    		{
    			ioe.printStackTrace();
    		}
     
    		return null;
    	}
    }
    Voilà la réponse :
    HEADER --->{null=[HTTP/1.1 500 Internal Server Error], Content-Length=[101], Connection=[Close], Date=[Fri, 01 Dec 2006 11:38:11 GMT], Content-Type=[text/html]}
    Sou unix/linx j'ai executer la command wget voilà le résultat :
    root@becane:~#wget X.X.X.X 443
    ...
    Connecting to X.X.X.X:443... connected.
    ERROR: Certificate verification error for X.X.X.X : unable to get local issuer certificate
    ERROR: certificate common name `X.X.X.X' doesn't match requested host name `X.X.X.X:443'.
    To connect to X.X.X.X:443 insecurely, use `--no-check-certificate'.
    Unable to establish SSL connection.

    --17:19:09-- http://443/
    => `index.html.1'
    Resolving 443... 0.0.1.187
    Connecting to 443|0.0.1.187|:80... failed: Invalid argument.
    FINISHED --17:19:09--
    Downloaded: 0 bytes in 0 files
    Apparament j'ai un problème de certificat !

    Comment utiliser le certificat du serveur https dans le code client java ?
    Et comment fait on pour l'obtenir ?

    Est ce que quelqu'un peut m'expliquer comment résoudre le problème est établir une connexion https ?

    Des exemples de code sa serai sympa.

    Merci d'avance

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 276
    Par défaut
    Il faut setter deux propriétés système comme cela:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    System.setPropert("javax.net.ssl.trustStore", "tonFichierCertificat.ks");
    System.setProperty("javax.net.ssl.trustStorePassword", "tonMotDePasse");
    Ensuite tu appelles ton service web normalement.

  3. #3
    Membre confirmé
    Inscrit en
    Janvier 2005
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 74
    Par défaut
    Citation Envoyé par fr1man
    Il faut setter deux propriétés système comme cela:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    System.setPropert("javax.net.ssl.trustStore", "tonFichierCertificat.ks");
    System.setProperty("javax.net.ssl.trustStorePassword", "tonMotDePasse");
    Ensuite tu appelles ton service web normalement.
    Comment fait on pour avoir le fichier "tonFichierCertificat.ks" ?

    Merci pour ton aide

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 276
    Par défaut
    Je ne vais pas pouvoir t'aider plus que ça, car je n'y connais pas grand chose.
    Ce que je peux dire, c'est que quand tu fais des connexions https, il te faut un certificat. Ce certificat peut être généré par les outils fournis avec le jdk, keytool. Si tu veux un vrai certificat, il faut faire appel à une boite qui t'en créera un.
    Voilà en gros ce que je sais. J'espère que je n'ai pas dit trop de bêtises.
    Bon courage.

  5. #5
    Membre confirmé
    Inscrit en
    Janvier 2005
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 74
    Par défaut
    Citation Envoyé par fr1man
    Je ne vais pas pouvoir t'aider plus que ça, car je n'y connais pas grand chose.
    Ce que je peux dire, c'est que quand tu fais des connexions https, il te faut un certificat. Ce certificat peut être généré par les outils fournis avec le jdk, keytool. Si tu veux un vrai certificat, il faut faire appel à une boite qui t'en créera un.
    Voilà en gros ce que je sais. J'espère que je n'ai pas dit trop de bêtises.
    Bon courage.
    si j'ai bien compris alors je dois creer mon propre certificats et faire la connexion au serveur HTTPS ? alors je n'ai pas besoin du certificats du serveur HTTPS ?

    Merci encore

  6. #6
    Membre confirmé
    Profil pro
    rfv
    Inscrit en
    Novembre 2006
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : rfv

    Informations forums :
    Inscription : Novembre 2006
    Messages : 91
    Par défaut Java WS HTTPS
    Je dois également me connecter a un WebService en HTTPS (sans proxy),
    si j'ai compris le principe, le serveur auquel tu veux accèder doit te filer un certificat SSL (X509) et une clef.

    Ensuite tu le convertis en PKCS12 (.p12)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    openssl pkcs12 -export -certfile serveurDistant-cert.pem -inkey user.key -out client.p12
    Et tu le convertis enfin en JKS
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    java org/mortbay/jetty/security/PKCS12Import $DST/client.p12 $DST/client.jks
    ( ou avec l'excelent outil KeyTool IUI http://ragingcat.developpez.com/java/outils/keytool/ui/ )

    Verifier le contenu de ton JKS
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    keytool -list -v -keystore client.jks
    Votre Keystore contient 1 entrée(s)
    Ensuite java accepte le format PKCS12 ou en natif le JKS
    Donc tu ajoute a ton keystore, le certificat que tu annonces comme sûr.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
          System.setProperty("javax.net.ssl.trustStore", "client.jks");
          System.setProperty("javax.net.ssl.trustStoreType", "jks");
          //System.setProperty("javax.net.ssl.trustStoreType", "pkcs12");
          System.setProperty("javax.net.ssl.trustStorePassword", "motDePasse");
    Voilà, j'en suis là, mais bloqué par l'exception :
    Exception in thread "main" 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
    En comptant sur ceux qui ont réussis pour nous expliquer la suite....

    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
    /*
     Setting properties
     
    The following properties must be set at start of maven to be accessible when HttpClient starts up.
     
    javax.net.ssl.trustStore
        the path to the keystore where trusted certificates are stored
    javax.net.ssl.trustStoreType
        the type of storage for this store, maybe either jks (default) or pkcs12
    javax.net.ssl.trustStorePassword
        the password protecting the store
    javax.net.ssl.keyStore
        the path to the keystore where user's private key is stored
    javax.net.ssl.keyStoreType
        the type of storage for this store, maybe either jks (default) or pkcs12
    javax.net.ssl.keyStorePassword
        the password protecting the store
     */

Discussions similaires

  1. [11gR2] Connexion distante sur le serveur oracle via un programme java
    Par lordgodgiven dans le forum Connexions aux bases de données
    Réponses: 2
    Dernier message: 10/07/2017, 17h06
  2. Connexion sur un Serveur HTTP via VBA Access 2003
    Par bibob20 dans le forum VBA Access
    Réponses: 2
    Dernier message: 04/02/2009, 09h31
  3. ODBC probleme de connexion du client LINUX --> serveur windows
    Par lmdpedat dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 05/07/2006, 11h32
  4. Réponses: 7
    Dernier message: 29/06/2006, 15h20
  5. [C++] Probleme de connexion socket client à mon serveur smtp
    Par matthieu5978 dans le forum Développement
    Réponses: 2
    Dernier message: 04/12/2005, 08h19

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