Ssl - serveur http/s avec certificat

Soyez le premier à donner votre avis sur cette source.

Vue 38 519 fois - Téléchargée 3 292 fois

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.

Source / Exemple :


ZIP ZIP ZIP ;-)

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

shiva426
Messages postés
1
Date d'inscription
jeudi 5 juillet 2007
Statut
Membre
Dernière intervention
5 juillet 2007
-
Bravo neodante ton code m'a été bien utile pour comprendre !!
cs_demo2000
Messages postés
8
Date d'inscription
mercredi 13 septembre 2006
Statut
Membre
Dernière intervention
5 décembre 2006
-
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
cs_neodante
Messages postés
2837
Date d'inscription
lundi 11 août 2003
Statut
Modérateur
Dernière intervention
16 décembre 2006
10 -
Ca tombe bien car c'est ma dernière source : http://www.javafr.com/codes/CONNEXION-TRAVERS-PROXY-HTTP-FTP_40511.aspx

++
cs_demo2000
Messages postés
8
Date d'inscription
mercredi 13 septembre 2006
Statut
Membre
Dernière intervention
5 décembre 2006
-
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 ?
cs_neodante
Messages postés
2837
Date d'inscription
lundi 11 août 2003
Statut
Modérateur
Dernière intervention
16 décembre 2006
10 -
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 ???
@+

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.