SSL - SERVEUR HTTP/S AVEC CERTIFICAT

j_aub Messages postés 99 Date d'inscription mercredi 25 août 2004 Statut Membre Dernière intervention 9 avril 2009 - 11 mars 2005 à 09:47
shiva426 Messages postés 1 Date d'inscription jeudi 5 juillet 2007 Statut Membre Dernière intervention 5 juillet 2007 - 5 juil. 2007 à 16:30
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/29581-ssl-serveur-http-s-avec-certificat

shiva426 Messages postés 1 Date d'inscription jeudi 5 juillet 2007 Statut Membre Dernière intervention 5 juillet 2007
5 juil. 2007 à 16:30
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
4 déc. 2006 à 15:21
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 2835 Date d'inscription lundi 11 août 2003 Statut Modérateur Dernière intervention 16 décembre 2006 11
4 déc. 2006 à 14:06
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
4 déc. 2006 à 12:25
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 2835 Date d'inscription lundi 11 août 2003 Statut Modérateur Dernière intervention 16 décembre 2006 11
1 avril 2005 à 01:22
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 ???
@+
jjtch Messages postés 1 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 31 mars 2005
31 mars 2005 à 17:13
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.(ServerSocket.java:185)
at java.net.ServerSocket.(ServerSocket.java:141)
at javax.net.ssl.SSLServerSocket.(SSLServerSocket.java:84)
at com.sun.net.ssl.internal.ssl.SSLServerSocketImpl.(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.
cs_neodante Messages postés 2835 Date d'inscription lundi 11 août 2003 Statut Modérateur Dernière intervention 16 décembre 2006 11
30 mars 2005 à 19:07
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 ...
javadan Messages postés 1 Date d'inscription dimanche 27 mars 2005 Statut Membre Dernière intervention 27 mars 2005
27 mars 2005 à 11:07
Il aurait été intéressant de montrer un exemple d'un client HTTP SSL qui envoie lui aussi son certificat.
Rejoignez-nous