begin process at 2008 08 29 08:21:41
1 233 523 membres
62 nouveaux aujourd'hui
14 291 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

SSL - SERVEUR HTTP/S AVEC CERTIFICAT


Information sur la source

Catégorie :Reseaux et Internet Classé sous : server, https, ssl, certificat, sécurité Niveau : Initié Date de création : 17/02/2005 Date de mise à jour : 07/03/2005 11:34:10 Vu / téléchargé: 22 524 / 2 335

Note :
10 / 10 - par 2 personnes
10,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (8)
Ajouter un commentaire et/ou une note


Description

Voici une utilisation des Socket SSL (SSLSocket et SSLServerSocket) pour permettre à 2 applications de communiquer en utilisant le protocole SSL (ici avec un peu de HTTP => donc HTTPS). L'utilisation de SSL en Java est vraiment très simple !!! Pour mettre un peu de difficulté, nous allons créer un certificat permettant d'authentifier le serveur, par conséquent il va vous falloir générer un certificat (bien qu'on ne soit pas obligé de le faire) qui est fournit dans les sources, mais vous pouvez faire le votre.

Une fois lancé à partir du BAT (sous linux changer simplement la synatxe pour l'exportation des variables d'environnement), le serveur HTTP et le serveur HTTPS devraient être démarrés. Vérifier cela dans la console à l'aide des informations du logger. Une fois les serveurs démarré, ouvrez votre navigateur favori (firef... ;-) ) et taper dans la barre d'adresse :
Serveur HTTP : http//127.0.0.1:8080/index.htm
Serveur HTTPS : https://127.0.0.1/index.htm

Normalement, une page internet (page d'accueil de mon site doit apparaître ...)

Remarque : Le serveur HTTP est sur le port 8080 afin d'éviter que cela interfère avec un serveur HTTP tournant déjà sur votre machine. Le serveur HTTPS utilise le port HTTPS qui est par défaut 443.
Attention les serveurs HTTP/S ici ne sont PAS DU TOUT sécurisé !!!! Leur but étant d'être simple.

Pour tout dire, les codes présents ici et bien qu'il n'y ait pas 2000 façons de le faire sont une adaptation des codes disponible sur le site de SUN dans les articles techniques. J'espère que les personnes qui ont besoin d'utiliser ce protocole ou qui redoutaient de l'utiliser vont s'y retrouver très vite, c'est vraiment trivial en Java ... et quand je dis vraiment je pèse bien mes mots !!!!

Créer le certificat du serveur

SSL utilise des certificats pour l'authentification. Les certificats doivent être créés pour les clients et les serveurs qui doivent communiquer avec sécurité en utilisant SSL. JSSE utilise des certificats créés en utilisant l'outil Java keytool. Nous allons générer un certificat RSA pour le serveur HTTPS :

keytool -genkey -keystore serverkeys -keyalg rsa -alias httpsserver

Cette commande génère un certificat référencé par l'alias httpsserver, et sera stocké dans un fichier nommé serverkeys. L'outil keytool va vous demander quelques informations pour générer le certificat (notez bien les mots de passe !) :

Enter keystore password:  codessources
What is your first and last name?
  [Unknown]:  www.javafr.com
What is the name of your organizational unit?
  [Unknown]:  Training and Consulting
What is the name of your organization?
  [Unknown]:  MonOrganisation
What is the name of your City or Locality?
  [Unknown]:  MonBled
What is the name of your State or Province?
  [Unknown]:  MaRegion
What is the two-letter country code for this unit?
  [Unknown]:  FR
Is CN=ultra, OU=Training and Consulting,
O=javacourses.com, L=Toronto, ST=Ontario, C=CA correct?
  [no]:  yes (ou oui pour ceux qui ont la version française ...)

Enter key password for <qusay>
        (RETURN if same as keystore password):  passhttpskey


Comme vous pouvez le voir, le keytool nous a demandé un mot de passe pour le keystore, ce qui signifie que pour accéder au keystore, le serveur doit connaître le mot de passe. Egalement, l'outil demande un mot de passe pour l'alias. Les mots de passe peuvent être spécifier sur la ligne de commande en utilisant les paramètres -keypass et -storepass.

A noter que l'information concernant votre nom (la première demandée par le keytool) est le nom de la machine donc soit son nom d'hôte soit son adresse IP.

La génération du certificat peut prendre quelques instants en fonction de la machine sur laquelle vous travaillez.
Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

17 février 2005 13:54:58 :
17 février 2005 14:10:17 :
Ajout capture écran
17 février 2005 18:47:18 :
Mise à cause description source
07 mars 2005 11:34:11 :
  • signaler à un administrateur
    Commentaire de javadan le 27/03/2005 11:07:25

    Il aurait été intéressant de montrer un exemple d'un client HTTP SSL qui envoie lui aussi son certificat.

  • signaler à un administrateur
    Commentaire de neodante le 30/03/2005 19:07:13 administrateur CS

    C'était une idée que j'avais à la base, mais un développeur se devra de lire la javadoc de la classe SSLSocket, et verra très vite qu'il suffit de mettre la méthode setNeedClientAuth() à true pour obliger un client à envoyer son certificat. La réalisation du client (SSLSocket) suivant exactement le même processus de création (certificat inclut) que le serveur ce n'est pas bien compliqué, d'autant que la source porte bien le nom de serveur HTTP/HTTPS ! Pour comparer quand tu installes Apache tu ne demandes pas un explorateur avec ??? Ici c'est pareille ...

  • signaler à un administrateur
    Commentaire de jjtch le 31/03/2005 17:13:42

    J'ai recu l'erreur suivante quand j'ai lance le HTTPSServer:
    Server HTTPS started ...
    java.net.BindException: Permission denied
            at java.net.PlainSocketImpl.socketBind(Native Method)
            at java.net.PlainSocketImpl.bind(PlainSocketImpl.java:359)
            at java.net.ServerSocket.bind(ServerSocket.java:319)
            at java.net.ServerSocket.<init>(ServerSocket.java:185)
            at java.net.ServerSocket.<init>(ServerSocket.java:141)
            at javax.net.ssl.SSLServerSocket.<init>(SSLServerSocket.java:84)
            at com.sun.net.ssl.internal.ssl.SSLServerSocketImpl.<init>(SSLServerSocketImpl.java:79)
            at com.sun.net.ssl.internal.ssl.SSLServerSocketFactoryImpl.createServerSocket(SSLServerSocketFactoryImpl.java:57)
            at HTTPSServer.getServerSocket(HTTPSServer.java:46)
            at HTTPSServer.run(HTTPSServer.java:22)
            at HTTPSServer$1.run(HTTPSServer.java:57)

    Est ce que quelqu'un peut me donner la solution pur ce problem ?

    Jean-Jacques.

  • signaler à un administrateur
    Commentaire de neodante le 01/04/2005 01:22:45 administrateur CS

    C'est simplement que tu dosi avoir un serveur qui écoute déjà sur ce port ... utilises-tu un autre serveur HTTP sur ta machine ???
    @+

  • signaler à un administrateur
    Commentaire de demo2000 le 04/12/2006 12:25:59

    Merci pour le code.

    Est ce qu'il n y a  pas un exemple de code qui illustre comment un client java se connecte a un server HTTPS via le proxy ?

  • signaler à un administrateur
    Commentaire de neodante le 04/12/2006 14:06:46 administrateur CS

    Ca tombe bien car c'est ma dernière source : http://www.javafr.com/codes/CONNEXION-TRAVERS-PROXY-HTTP-FTP_40511.aspx

    ++

  • signaler à un administrateur
    Commentaire de demo2000 le 04/12/2006 15:21:15

    Pour ton code : http://www.javafr.com/codes/CONNEXION-TRAVERS-PROXY-HTTP-FTP_40511.aspx, j'ai poster labà une petite remarque labà :).

    Concernant notre sujet, noilà mon problème :
    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 :

    // Begin code

    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;
    }
    }


    // End code

    a l'execution j'ai un message :

    // begin message
    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]}

    // End message

    Sou unix/linx j'ai executer la command wget voilà le résultat :

    // begin execute command in unix/linux
    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


    // End execute command in unix/linux

    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




  • signaler à un administrateur
    Commentaire de shiva426 le 05/07/2007 16:30:35

    Bravo neodante ton code m'a été bien utile pour comprendre !!

Ajouter un commentaire

Pub



Appels d'offres

Recherche developpeur ...
Budget : 700€
SITE MARCHAND LOCATION...
Budget : 3 000€
SITE MARCHAND POUR HOTEL
Budget : 4 000€

Snippets en rapport

CalendriCode

Août 2008
LMMJVSD
    123
45678910
11121314151617
18192021222324
25262728293031

Boutique

Boutique de goodies CodeS-SourceS