Connexion HTTPS via tunnel ssh ?
Bonjour à tous,
J'essaie de me connecter à un serveur avec HTTPS. Or je n'ai pas accès à ce serveur à partir de mon poste.
J'ai donc utilisé Putty pour me créer un tunnel SSH sur le port 123 de ma machine. Ce tunnel me connecte sur une machine distante, à partir de laquelle je souhaite faire ma connexion HTTPS car elle a accès au serveur (vous me suivez toujours ?).
J'ai réussi à m'en sortir avec Putty et à lancer un tunnel SSH, cependant je ne sais pas comment faire pour ouvrir une connexion HTTPS en apssant par le tunnel SSH.
Quelqu'un serait-il capable de m'expliquer le principe ?
Pour le moment j'ai essayé d'utiliser le tunnel comme s'il s'agissait d'un proxy ... mais je suppose que ce n'est pas comme ça que je dois procéder ^^'
Voici le code que j'utilise actuellement mais qui ne fonctionne pas :
Code:
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
| System.setProperty("java.protocol.handler.pkgs", "javax.net.ssl");
System.getProperties().put("javax.net.debug", "ssl");
System.getProperties().put("https.proxySet", "true");
System.getProperties().put("https.proxyHost", "localhost");
System.getProperties().put("https.proxyPort", "123");
System.getProperties().put("http.proxyHost", "localhost");
System.getProperties().put("http.proxyPort", "123");
java.security.Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
final TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager() {
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return null;
}
public void checkClientTrusted(final java.security.cert.X509Certificate[] certs, final String authType) {
}
public void checkServerTrusted(final java.security.cert.X509Certificate[] certs, final String authType) {
}
}};
final SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, trustAllCerts, new java.security.SecureRandom());
// La chaine encodée
final String encodingGood = Base64.encodeString(loginMdp);
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
final HttpsURLConnection conn = (HttpsURLConnection) new URL(uri).openConnection();
// Authentification basic
conn.setRequestProperty("Authorization", "Basic " + encodingGood);
conn.connect(); |
L'erreur obtenue est la suivante :
Code:
1 2 3 4 5 6 7 8 9
| trigger seeding of SecureRandom
done seeding SecureRandom
Exception in thread "main" java.util.NoSuchElementException
at java.util.StringTokenizer.nextToken(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.doTunneling(Unknown Source)
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(Unknown Source)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.connect(Unknown Source)
at com.sfr.si.activation.m2m.monarc.core.collecte.webservice.TestWebService.testConnection(TestWebService.java:102)
at com.sfr.si.activation.m2m.monarc.core.collecte.webservice.TestWebService.main(TestWebService.java:43) |
Merci d'avance
[EDIT]
L'erreur venait d'une mauvaise utilisation du tunnel ssh. Voici ce que j'ai fait pour résoudre le problème :
J'ouvre un tunnel ssh vers le port Y du serveur auquel de veux envoyer ma requète sur le port X de ma machine.
Je lance la connexion ssh avec putty sur la machine distante qui a accès au serveur. Je me log.
Je lance mon programme java en remplaçant l'adresse du serveur par mon adresse en local :
URL à laquelle je veux envoyer ma requète (sans tunnel) : https://monserveur:Y/webservice
URL à laquelle j'envoie ma requète quand le tunnel est ouvert sur le port X :
https://localhost:X/webservice
Et là ... ça fonctionne ! :ccool:
[/EDIT]