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

Applets Java Discussion :

Applet et HTTPS


Sujet :

Applets Java

  1. #1
    Membre actif Avatar de DarkSeiryu
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2009
    Messages
    425
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Janvier 2009
    Messages : 425
    Points : 275
    Points
    275
    Par défaut Applet et HTTPS
    Bonjour tout le monde !

    Bon, j'ai deux soucis concernant mon Applet avec le HTTPS...
    1. elle doit s'exécuter sur un site HTTPS
    2. elle doit me permettre de transmettre des fichiers sur le serveur où est hébergé ce même site (donc en HTTPS)

    Donc, mon premier souci à régler étant l'exécution de l'Applet sur mon site HTTPS.
    Il faut savoir qu'un certificat est nécessaire pour se connecter au site Web en question, et c'est surement pour cela que mon Applet refuse de s'exécuter sur le site vu que dans NetBeans ou sur un site HTTP il n'y a pas de souci.
    Exception retournée quand j'exécute l'Applet sur le site HTTPS (ça met d'ailleurs sacrément longtemps à me sortir l'Exception...) :
    java.lang.ClassNotFoundException: ExportHeliosJApplet.class
    at sun.plugin2.applet.Applet2ClassLoader.findClass(Unknown Source)
    at sun.plugin2.applet.Plugin2ClassLoader.loadClass0(Unknown Source)
    at sun.plugin2.applet.Plugin2ClassLoader.loadClass(Unknown Source)
    at sun.plugin2.applet.Plugin2ClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.plugin2.applet.Plugin2ClassLoader.loadCode(Unknown Source)
    at sun.plugin2.applet.Plugin2Manager.createApplet(Unknown Source)
    at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
    Exception : java.lang.ClassNotFoundException: ExportHeliosJApplet.class
    Du coup, que faut-il que je fasse pour que mon Applet s'exécute sur mon site ?

    Ensuite, le transfert de fichiers.
    Jusque là, on a un autre Applet fonctionnel nous permettant de faire des transferts, mais sur du HTTP à l'aide de l'outil HttpClient d'Apache.
    D'après mes recherches, il y a une histoire de KeyStore et TrustStore. J'ai d'ailleurs trouvé pas mal d'exemples de code permettant soit de passer outre la demande de certificat du serveur (ça semble fonctionner) soit d'autoriser tous les hosts et tous les certificats (ça n'a pas fonctionné). Cela dit, je suis un peu perdu et ai du mal à trouver la bonne solution, sachant qu'il faut que je puisse faire ce transfert de fichier sur du HTTPS (pas trop le choix vu que le site requiert un certificat).
    Donc, comment faire pour arriver à transmettre des fichiers en HTTPS ?

    D'avance, merci.

    DarkSeiryu

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    765
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 765
    Points : 1 036
    Points
    1 036
    Par défaut
    Bonjour,

    Il faut savoir qu'un certificat est nécessaire pour se connecter au site Web en question, et c'est surement pour cela que mon Applet refuse de s'exécuter sur le site vu que dans NetBeans ou sur un site HTTP il n'y a pas de souci.
    Déjà, l'applet ne s'execute pas sur le site, mais sur le poste client.

    Ensuite il va te falloir signer l'applet pour faire quoi que ce soit avec un fichier. Et enfin faire du https dans l'applet. C'est pas forcement très compliqué d'autant que sur internet il y a plein d'exemple.

    Mais il est important que tu te documente sur ce qu'est un Keystore, un TrustStore et un certificat. Tu n'y couperas pas.

    Bon courage,

  3. #3
    Membre actif Avatar de DarkSeiryu
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2009
    Messages
    425
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Janvier 2009
    Messages : 425
    Points : 275
    Points
    275
    Par défaut
    Yo ! Merci pour ta réponse.

    Alors, je sais que l'Applet s'exécute sur le poste client. Je me suis peut-être mal exprimé, mais quand je la lance depuis un site HTTP ça fonctionne, mais sur un HTTPS ça ne fonctionne pas. D'où ma demande.
    Ensuite, l'Applet est déjà signé (oublié de le préciser, désolé ^^). Pour ce qui est du KeyStore, je me suis documenté. Surtout que que j'ai mon propre objet KeyStore dans lequel je stocke les certificats utilisateurs qui sont stockés dans son magasin de certificats Windows ou sur le trousseau de clés Mac. Ce que je ne sais pas, c'est quoi rajouter dans mon KeyStore pour que le transfert de fichiers puisse s'éxécuter en HTTPS.

    Enfin, faire du HTTPS dans l'Applet. Ben oui je m'en doute, mais ma question c'est comment faire ? Quelle(s) API(s) utiliser ? Parce que les exemples dont tu parles, je ne les ai pas vu alors que j'ai fait moults recherches.

    Merci d'avance !

    DarkSeiryu

  4. #4
    Membre actif Avatar de DarkSeiryu
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2009
    Messages
    425
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Janvier 2009
    Messages : 425
    Points : 275
    Points
    275
    Par défaut
    Re à tous.

    Du coup, à force de recherches, j'ai fini par me faire une méthode qui, théoriquement (ouais parce que pour moi c'est censé fonctionner ), devrait me permettre de faire mes transferts de fichier dans un environnement HTTPS :

    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
    public static void sendViaHttps(String url, File file, ArrayList<Proxy> proxysList) {
     
    	try {
    //		System.setProperty("java.protocol.handler.pkgs", "com.sun.net.ssl.internal.www.protocol");
    //		java.security.Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
     
    		char[] certPass = "myPass".toCharArray();
    		InputStream certInput = AppletAWS.frame.getClass().getResourceAsStream("path/to/my/certificate");
     
    		KeyStore ks = KeyStore.getInstance("PKCS12");
    		ks.load(certInput, certPass);
     
    		KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
    		keyManagerFactory.init(ks, certPass);
    		KeyManager[] keyManager = keyManagerFactory.getKeyManagers();
     
    		TrustManager[] trustManager = 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;
    				}
     
    				@Override
    				public java.security.cert.X509Certificate[] getAcceptedIssuers() {
    					return null;
    				}
     
    				@Override
    				public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) {}
     
    				@Override
    				public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) {}
    			}
    		};
     
    		SSLContext sslContext = SSLContext.getInstance("SSL");
    		sslContext.init(keyManager, trustManager, null);
     
    		for (Proxy proxy : proxysList) {
    			InetSocketAddress addr = (InetSocketAddress) proxy.address();
     
    			System.setProperty("http.proxyHost", addr.getHostName()); // L'adresse du proxy.
    			System.setProperty("http.proxyPort", Integer.toString(addr.getPort()));	// Le port du proxy.
    		}
     
    		HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory());
    		HttpsURLConnection connection = (HttpsURLConnection) new URL(url).openConnection();
     
    		connection.setDoInput(true);
    		connection.setDoOutput(true);
     
    		String cookieHeader = connection.getHeaderField("set-cookie");
    		if (cookieHeader != null) {
    			String cuki	= "";
     
    			int index	= cookieHeader.indexOf(";");
    			if (index >= 0)
    				cuki = cookieHeader.substring(0, index);
     
    			connection.setRequestProperty("Cookie", cuki);
    		}
     
    		connection.setRequestMethod("POST");
    		connection.setFollowRedirects(true);
     
    		final String encodage = "UTF-8";
    		String query = "fichier=" + URLEncoder.encode(new FileBody(file).getTransferEncoding(), encodage);
     
    		//connection.setRequestProperty("Accept-Language","it");
    		//connection.setRequestProperty("Accept", "application/cfm, image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, image/png, //*/*");
    		//connection.setRequestProperty("Accept-Encoding","gzip");
     
    		int queryLength = query.length();
    		AppletAWS.err("\nQuery : " + query);
    		AppletAWS.err("Longueur de la query : " + queryLength + "\n");
     
    		connection.setRequestProperty("Content-length", String.valueOf(queryLength));
    		connection.setRequestProperty("Content-Type", "application/x-www- form-urlencoded");
    		connection.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows 98; DigExt)");
     
    		// open up the output stream of the connection 
    		DataOutputStream output = new DataOutputStream(connection.getOutputStream());
     
    		// write out the data 
    		output.writeBytes(query);
    		output.close();
     
    		AppletAWS.print("Resp Code:" + connection.getResponseCode());
    		AppletAWS.print("Resp Message:" + connection.getResponseMessage());
     
    		// get ready to read the response from the cgi script 
    		DataInputStream input = new DataInputStream(connection.getInputStream());
     
    		// read in each character until end-of-stream is detected 
    		for (int c = input.read(); c != -1; c = input.read())
    			AppletAWS.print((char) c);
     
    		input.close();
    	}
    	catch (Exception e) {
    		AppletAWS.err("Something bad just happened.");
    		AppletAWS.err(e);
    		e.printStackTrace();
    	}
    }
    Quand je fais un test de transfert, voilà ce que la console me sort :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    java.net.ProtocolException: Can't reset method: already connected
    java.net.ProtocolException: Can't reset method: already connected
    Something bad just happened.
    java.net.ProtocolException: Can't reset method: already connected
    	at java.net.HttpURLConnection.setRequestMethod(HttpURLConnection.java:320)
    	at sun.net.www.protocol.https.HttpsURLConnectionImpl.setRequestMethod(HttpsURLConnectionImpl.java:354)
    	at OutilsAWS.Outils.SSLConnection.HttpsPost.sendViaHttps(HttpsPost.java:106)
    	at OutilsAWS.Thread.Transfert.Http.Apache.UploadApache.run(UploadApache.java:103)
    La ligne 106 de ma classe OutilsAWS.Outils.SSLConnection.HttpsPost est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    connection.setRequestMethod("POST");
    Malgré plusieurs tentatives, je n'arrive pas à résoudre ce problème... Est-ce que quelqu'un pourrait m'aider SVP ?

    Autre question, tant que j'y suis, est-ce que cette méthode me permettra de faire du transfert de fichier ? Parce que j'ai cru comprendre que ça n'acceptait pas les données binaires (donc les fichiers).
    Si le transfert de fichier est censé fonctionner avec cette méthode, est-ce que je m'y prend correctement avec mon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String query = "fichier=" + URLEncoder.encode(new FileBody(file).getTransferEncoding(), encodage);
    ?

    Merci d'avance.

    DarkSeiryu

    EDIT : j'ai pompé cette méthode via deux sources :
    - http://www.java-samples.com/showtuto...utorialid=1343 pour les HttpsUrlConnection
    - http://www.developpez.net/forums/d24...y/#post2227955 pour tout le SSLContext

    EDIT 2 : pensant que le bug venait du fait que cette méthode est appelée dans une boucle pour chacun des fichiers à transférer, j'ai rajouté la déconnexion de mon HttpsURLConnection à la fin de ma méthode mais ça n'a rien changé...

  5. #5
    Membre actif Avatar de DarkSeiryu
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2009
    Messages
    425
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Janvier 2009
    Messages : 425
    Points : 275
    Points
    275
    Par défaut
    Désolé je reviens à l'assaut mais j'ai vraiment besoin d'aide (c'pour le boulot ^^).

    J'ai effectué des modif' du coup. Au lieu de tout faire dans une méthode static, j'ai fait une vraie classe avec un constructeur qui m'initialise la connexion HTTPS, une autre qui me crée la query et une dernière qui effectue l'envoi.
    Voici le code de ma classe :

    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
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    import UI.Composent.AppletAWS.AppletAWS;
    import aws.apache.http.entity.mime.content.FileBody;
    import java.io.DataInputStream;
    import java.io.DataOutputStream;
    import java.io.File;
    import java.io.InputStream;
    import java.net.InetSocketAddress;
    import java.net.Proxy;
    import java.net.URL;
    import java.net.URLEncoder;
    import java.security.KeyStore;
    import java.util.ArrayList;
    import java.util.Enumeration;
    import javax.net.ssl.HttpsURLConnection;
    import javax.net.ssl.KeyManager;
    import javax.net.ssl.KeyManagerFactory;
    import javax.net.ssl.SSLContext;
    import javax.net.ssl.TrustManager;
    import javax.net.ssl.X509TrustManager;
     
    /**
     * A free Java sample program to POST to a HTTPS secure SSL website.
     * Free for use as long as this comment is included in the program as it is.
     * @see http://www.java-samples.com/showtutorial.php?tutorialid=1343
     * @see http://www.java-samples.com for more Free Java programs available for download
     * 
     * Pour tous ce qui touche aux contexte SSL :
     * @see http://www.developpez.net/forums/d246453/java/developpement-web-java/web-services/connexion-java-client-serveur-https-via-proxy/#post2227955
     * @author William Alexander
     */
    public class HttpsPost {
    	private final String _certPath		= "/path/to/my/certificate.p12"; // Le chemin vers le certificat.
    	private final char[] _certPass		= "certPass".toCharArray(); // Le mot de passe du certificat.
    	private final char[] _keyStorePass	= "keyStorePass".toCharArray(); // Le mot de passe du KeyStore.
     
    	private HttpsURLConnection _connection;
    	private String _query;
    	private String _response;
     
    	/**
             * Constructeur. Initialise la connexion HTTPS.
             * @param url l'URL à laquelle se connecter
             * @param proxysList la liste des proxys détectés
             */
    	public HttpsPost(String url, ArrayList<Proxy> proxysList) {
    		this._query		= "";
    		this._response	= "";
     
    		try {
    //			System.setProperty("java.protocol.handler.pkgs", "com.sun.net.ssl.internal.www.protocol");
    //			java.security.Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
     
    			// On récupère le certificat.
    			InputStream certInput = AppletAWS.frame.getClass().getResourceAsStream(this._certPath);
     
    			// Création d'un KeyStore PKCS12.
    			KeyStore ksP12 = KeyStore.getInstance("PKCS12");
    			ksP12.load(certInput, this._certPass); // Ajout du certificat dans ce KeyStore.
     
    			String alias = ""; // Va contenir l'alias du certificat.
     
    			// Récupération de l'alias.
    			Enumeration aliases = ksP12.aliases();
    			while (aliases.hasMoreElements())
    				alias = (String) aliases.nextElement();
     
    			KeyStore ksJks = KeyStore.getInstance("JKS"); // Création d'un KeyStore Java.
    			ksJks.load(null, this._keyStorePass);
     
    			 // Ajout du certificat dans le KeyStore Java.
    			ksJks.setKeyEntry(
    				alias,
    				ksP12.getKey(alias, this._certPass), // La clé du certificat.
    				this._keyStorePass,
    				ksP12.getCertificateChain(alias) // Le certificat.
    			);
     
    			aliases = ksJks.aliases();
    			while (aliases.hasMoreElements())
    				AppletAWS.print("\n" + (String) aliases.nextElement());
     
    			// Création d'une KeyManagerFactory.
    			KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
    			keyManagerFactory.init(ksJks, this._keyStorePass);
     
    			KeyManager[] keyManager = keyManagerFactory.getKeyManagers();
     
    			// TODO : créer un TrustManager sécurisé dans lequel on met nos données de certificats.
    			// Pour l'instant, afin de faire des tests, je fais confiance à tous les certificats.
    			TrustManager[] trustManager = 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;
    					}
     
    					@Override
    					public java.security.cert.X509Certificate[] getAcceptedIssuers() {
    						return null;
    					}
     
    					@Override
    					public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) {}
     
    					@Override
    					public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) {}
    				}
    			};
     
    			// On crée notre contexte SSL.
    			SSLContext sslContext = SSLContext.getInstance("SSL");
    			sslContext.init(keyManager, trustManager, null);
     
    			// Si il y a des proxys, on les ajoute à la connexion.
    			if (!proxysList.isEmpty()) {
    				for (Proxy proxy : proxysList) {
    					InetSocketAddress addr = (InetSocketAddress) proxy.address();
     
    					System.setProperty("http.proxyHost", addr.getHostName()); // L'adresse du proxy.
    					System.setProperty("http.proxyPort", Integer.toString(addr.getPort()));	// Le port du proxy.
    				}
    			}
     
    			// On ajoute à l'HttpsURLConnection notre constexte SSL.
    			HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory());
    			HttpsURLConnection.setFollowRedirects(true);
     
    			// Création et initialisation de la connexion HTTPS.
    			this._connection = (HttpsURLConnection) new URL(url).openConnection();
    			this._connection.setDoInput(true);
    			this._connection.setDoOutput(true);
     
    			String cookieHeader = this._connection.getHeaderField("set-cookie");
    			if (cookieHeader != null) {
    				String cuki	= "";
     
    				int index = cookieHeader.indexOf(";");
    				if (index >= 0)
    					cuki = cookieHeader.substring(0, index);
     
    				this._connection.setRequestProperty("Cookie", cuki);
    			}
     
    //			this._connection.setRequestMethod("POST");
    		}
    		catch (Exception e) {
    			AppletAWS.err("Une erreur est survenue pendant la création de la connexion sécurisée : " + e.getMessage());
    			e.printStackTrace();
    		}
    	}
     
    	/**
             * Crée le query à envoyer en POST.
             * @param file le fichier à envoyer
             * @param idClient l'ID du client
             * @param idEtab l'ID de l'établissement
             * @param md5File le MD5 du fichier à transférer
             */
    	public void setQuery(File file, String idClient, String idEtab, String md5File) {
    		final String encodage = "UTF-8";
     
    		try {
    			this._query = "fichier=" + URLEncoder.encode(new FileBody(file).getTransferEncoding(), encodage);
    			this._query += "&idClient=" + URLEncoder.encode(idClient, encodage);
    			this._query += "&idEtab=" + URLEncoder.encode(idEtab, encodage);
    			this._query += "&md5=" + URLEncoder.encode(md5File, encodage);
     
    			int queryLength = this._query.length();
    			AppletAWS.err("\nQuery : " + this._query);
    			AppletAWS.err("Longueur de la query : " + queryLength + "\n");
     
    			this._connection.setRequestProperty("Content-length", String.valueOf(queryLength));
    			this._connection.setRequestProperty("Content-Type", "application/x-www- form-urlencoded");
    			this._connection.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows 98; DigExt)");
    		}
    		catch (Exception e) {
    			AppletAWS.print("Une erreur est survenue lors de la création de la requête HTTPS : " + e.getMessage());
    			e.printStackTrace();
    		}
    	}
     
    	/**
             * Envoi la requête.
             */
    	public void upload() {
    		try {
    			//connection.setRequestProperty("Accept-Language","it");
    			//connection.setRequestProperty("Accept", "application/cfm, image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, image/png, //*/*");
    			//connection.setRequestProperty("Accept-Encoding","gzip");
     
    			// open up the output stream of the connection 
    			DataOutputStream output = new DataOutputStream(this._connection.getOutputStream());
     
    			// write out the data 
    			output.writeBytes(this._query);
    			output.close();
     
    			int responseCode	= this._connection.getResponseCode();
    			String responseMsg	= this._connection.getResponseMessage();
     
    			AppletAWS.print("Resp code : " + responseCode);
    			AppletAWS.print("Resp message : " + responseMsg);
     
    			// get ready to read the response from the cgi script 
    			DataInputStream input = new DataInputStream(this._connection.getInputStream());
     
    			// read in each character until end-of-stream is detected 
    			AppletAWS.print("\nREPONSE :");
    			for (int c = input.read(); c != -1; c = input.read())
    				AppletAWS.print((char) c);
     
    			input.close();
    		}
    		catch (Exception e) {
    			AppletAWS.err("Une erreur est survenue pendant le transfert : " + e.getMessage());
    			e.printStackTrace();
    		}
    	}
     
    	/**
             * Ferme la connexion.
             */
    	public void closeConnection() {
    		this._connection.disconnect();
    	}
    }
    Du coup, pour l'utilisation, je crée mon objet HttpsPost avant ma boucle sur ma liste de fichiers à envoyer. Je passe cette connexion à mon Panel qui la passe au thread qui va effectuer l'envoi.
    Dans la méthode run() de ce thread, j'ai ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    try {
    	this._httpsConn.setQuery(this._pli.getDossier(), ((String) this.fireGetParam("Id_Client")), ((String) this.fireGetParam("Id_Etablissement")), this._pli.getMd5());
    	this._httpsConn.upload();
    }
    catch (Exception e) {
    	System.out.println("Une erreur est survenue : " + e.getMessage());
    	e.printStackTrace();
    }
    Et bref, quand j'exécute l'Applet, voici l'exception que je me mange au moment où j'essaie d'envoyer les fichiers :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Une erreur est survenue pendant le transfert : HTTPS hostname wrong:  should be <mon.site.com>
    java.io.IOException: HTTPS hostname wrong:  should be <mon.site.com>
    	at sun.net.www.protocol.https.HttpsClient.checkURLSpoofing(HttpsClient.java:524)
    	at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:448)
    	at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:166)
    	at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:1014)
    	at sun.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:230)
    	at OutilsAWS.Outils.SSLConnection.HttpsPost.upload(HttpsPost.java:201)
    	at OutilsAWS.Thread.Transfert.Https.UploadHttps.run(UploadHttps.java:52)
    A cette ligne là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DataOutputStream output = new DataOutputStream(this._connection.getOutputStream());
    Du coup, ça semble venir d'un problème entre le certificat serveur et le certificat que je passe à mon Java KeyStore. Mais je ne comprends pas pourquoi ça ferait ça, étant donné que ce certificat, je m'en sers pour me connecter au site en question...

    Est-ce que quelqu'un aurait un élément de réponse s'il-vous-plaît ?

  6. #6
    Membre actif Avatar de DarkSeiryu
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2009
    Messages
    425
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Janvier 2009
    Messages : 425
    Points : 275
    Points
    275
    Par défaut
    Hum autant pour moi, il suffisait de faire un HostnameVerifier. Je pensais l'avoir déjà fait c'pour ça que quand j'ai cherché je suis passé à côté.

    Le code si y'a des intéressés :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    HostnameVerifier myHv = new HostnameVerifier() {
     
    	@Override
    	public boolean verify(String hostName, javax.net.ssl.SSLSession session) {
    		return true;
    	}
    };
     
    HttpsURLConnection.setDefaultHostnameVerifier(myHv);
    Attention cependant, ce Verifier accepte tous les hostnames, ce qui n'est pas sécurisé. Pensez à faire le votre qui acceptera vos propres paramètres.

    Maintenant il semblerait que ma connexion en HTTPS fonctionne, puisque l'Exception qui est maintenant retournée est une java.net.SocketException: Unexpected end of file from server.
    Je vais aller ouvrir un thread sur le forum concerné.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 16/04/2009, 11h46
  2. Upload HTTP dans une Applet
    Par ol974 dans le forum Applets
    Réponses: 5
    Dernier message: 04/06/2008, 14h11
  3. Communication Applet-servlet : retour HTTP 505
    Par motorenshi dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 14/02/2007, 10h49
  4. communication servlet/applet via le protocole https
    Par hlaura dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 18/07/2006, 17h41
  5. [applet][JSP][tomcat] HTTP Connection failed
    Par Raylemon dans le forum Servlets/JSP
    Réponses: 12
    Dernier message: 10/03/2005, 15h13

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