begin process at 2010 02 10 08:29:02
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Reseaux et Internet

 > SSL - SERVEUR HTTP/S AVEC CERTIFICAT

SSL - SERVEUR HTTP/S AVEC CERTIFICAT


 Information sur la source

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

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
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é :29 228 / 2 661

Auteur : neodante

Ecrire un message privé
Ce membre participe au partage de revenus publicitaires
Commentaire sur cette source (8)
Ajouter un commentaire et/ou une note


 Description

Cliquez pour voir la capture en taille normale
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.



 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

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 :

 Sources du même auteur

CONNEXION AU TRAVERS D'UN PROXY HTTP / FTP
Source avec Zip CONVERTISSEUR MYSQL VERS POSTGRESQL
Source avec une capture MANIPULER LA BARRE SYSTEME
Source avec Zip Source avec une capture TOUR DE HANOI GUI
Source avec Zip TUTORIAL VIDEO WEB SERVICE : LES FICHIERS

 Sources de la même categorie

Source avec Zip SERVEUR GENERIQUE par pacifikateur
Source avec Zip Source avec une capture JOMESSENGER : APPLICATION CLIENT/SERVER par numurique
Source avec Zip MINI SERVEUR HTTP par yvesyves
Source avec Zip Source avec une capture TCHAT EN DEUX PARTIES: CLIENT ET SERVEUR par benads
Source avec Zip CONNEXION SERVEUR VIA PROXY EN JAVA par moumou95

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture LECTEUR DE CERTIFICATS GPG par dje_jay
CHARCRYPT par CHAR As Human
Source avec Zip ENVOI ET LECTURE DE MAILS (+AUTHENTIFICATION +SSL +PIÈCES JO... par tarzent
Source avec Zip CHAT ULTRA SIMPLE EN 2 CLASSES par bloofi
Source avec Zip SERVEUR DE WEBCAM par Rocco123

Commentaires et avis

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.

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 ...

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.

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 ???
@+

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 ?

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

++

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




Commentaire de shiva426 le 05/07/2007 16:30:35

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

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

HTTPS certificat [ par ludoW21 ] Bonjour,je débute dans le monde des certificat SSL. J'ai 2 questions :- Est-il possible de spécifier autrement que par des         System.setProperty( Comment crée un certificat de sécurité java (pour le chat irc) [ par sorcier3 ] Bonjour,je voudrais savoir comment on cr&#233;e un certificat de s&#233;curit&#233; java pour le chat irc, comme celui-ci : Bien sur, en le mettan lier un certificat à une urlconnection [ par byob ] Bonjour, je me connecte à un site securisé https et je lui envois des données en post sous format xml, je suis sensée recuperer un xml en retour.hors Java protocole XmlRpc et certificat SSL [ par jm95zl60 ] Bonjour,j'aurai besoin de renseignements sur un développement en cours ...J'utilise Eclipse et je développe en Java.Je voudrais contacter un Web Servi bug du JRE 1.5.0 concernant SSL et les PROXY [ par hmarchal ] Bonjour, je suis d&#233;butant en JAVA.Je suis en train de d&#233;velopper une application qui doit importer une page html.Or le site est s&#233;curis deux server et plusieurs client.... [ par collinm ] Problème de connexion HTTPS (J2ME) [ par darb66 ] Bonjour, je d&#233;veloppe un client J2ME pour acc&#233;der &#224; un service web &#233;crit en VB.Net. Pour cela j'utilise une connexion HTTPS qui en connexion jdbc sql server en authentification windows [ par pfovez ] j'aimerai savoir s'il est possible de se connecter a une bdd sql server 2000 en authentification windows ?et si oui comment faire?merci Sécurité et Java [ par SLaYerS ] Bonjour &#224; tous ! &nbsp;&nbsp;&nbsp; Voila, je suis en train de r&#233;alis&#233; une applet et j'aimerai bien pouvoir afficher le contenu d'une DTS SQL Server [ par jguillemette ] bonjour,est-il possible d'ex&#233;cuter un lot DTS SQL Server &#224; partir d'une application java avec une methode (de&nbsp;java.sql ou autre)&nbsp;m


Nos sponsors


Sondage...

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,373 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales