HttpsUrlConnection et les proxies - Java - Programmation
Marsh Posté le 02-02-2004 à 11:09:16
c'est marrant je dois faire un truc similaire d'ici peu...
.... et puis non je sais pas mais je pensais que c'etait juste avec ce que tu ecrit plus haut
Marsh Posté le 02-02-2004 à 11:11:22
DarkLord a écrit :
|
Chu d'dans, là et à part des threads sans reply, j'trouve pas des masses de trucs
M'enfin des fois j'trouve des bouts de codes qui diffèrent du mien par certains aspects, donc je tente
Ah ouais, pour la précision, quand j'tente une connec, j'ai l'exception :
Citation : java.net.ConnectException: Connection timed out: connect |
En gros, ça passe pas le proxy, quoi
Perso j'ai des gros gros doutes quant au passage du user/password vers le proxy.
Marsh Posté le 02-02-2004 à 11:18:19
et mettre un sniffer HTTP sur ta machine pour voir ce qu'il glandouille ca aiderait pas?
Marsh Posté le 02-02-2004 à 11:20:51
ReplyMarsh Posté le 02-02-2004 à 11:21:00
mouais, pareil, soit tu utilises Etheral... mais sinon les headers http te disent quoi?, ca peut pas suffire plutot que sniffer?
Marsh Posté le 02-02-2004 à 11:25:23
benou a écrit : UrlConenction suxor ! |
Code :
|
un truc comme ca et apres tu fais un getInputStream ... (necessaire ??)
edit: ca change rien au probleme si c'est le proxy qui merde
Marsh Posté le 02-02-2004 à 11:27:08
Ouais, j'ai tout le matos de tracing et autre m'enfin spa top vu le trafic réseau dégueulasse qu'il y a ici
Par contre, j'ai trouvé ça : http://forum.java.sun.com/thread.j [...] ead=413312
Seul problème : avec ma 1.4.2, j'me bouffe un ClassCastException lors du cast de l'URLConnection en HttpsUrlConnection
Quand j'fais un println() de la classe, j'tombe sur com.sun.net.ssl.internal.www.protocol.https.HttpsURLConnectionOldImpl
En fait, le truc que j'ai fait par rapport au prog du type, c'est rajouter System.setProperty("java.protocol.handler.pkgs","com.sun.net.ssl.internal.www.protocol" );
et java.security.Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
Marsh Posté le 02-02-2004 à 11:28:18
uriel a écrit : |
Exactement
HttpsUrlConnection va certainement utiliser des SSLSockets derrière, donc y aller à la bite et au couteau, à part me virer des méthodes utiles genre getResponseCode(), ça va pas m'apporter grand-chose
Marsh Posté le 02-02-2004 à 11:46:19
uriel a écrit : edit: ca change rien au probleme si c'est le proxy qui merde |
nan mais je pars du principe que le proxy marche ...
j'imagine qu'il arrive à s'en servir avec son browser
C'est juste qu'en le faisant à coup de socket tu sauras exactement ce que tu envois et ce que tu reçois ...
Marsh Posté le 02-02-2004 à 11:49:33
d'autant que tout ce qu'on peut trouver, ce sont les :
System.setProperty("proxyHost", "w.x.y.z" ); // adresse IP
System.setProperty("proxyPort", "numéro du port" );
deja mis donc ca doir merder ailleurs
Marsh Posté le 02-02-2004 à 11:51:23
Bon bin j'passe bien le proxy !@#
En fait, j'utilisais mon proxy HTTPS sur le port 443 (comme dans ma config de browser) alors qu'il fallait utiliser le proxy HTTP sur le port 8080 J'ai pas pigé l'astuce
Bref, maintenant j'me bouffe une erreur de certificat ; ça a l'air d'être un problème plus commun mais si vous avez des soluces, n'hésitez pas
Marsh Posté le 02-02-2004 à 11:52:33
d'après cet article, tu ne dois pas mettre BASIC devant les données d'identification ...
http://www.javaworld.com/javaworld [...] tip42.html
Marsh Posté le 02-02-2004 à 11:53:21
uriel a écrit : d'autant que tout ce qu'on peut trouver, ce sont les : |
Donc ouais, y a déjà ça, mais y a des infos à passer en plusse : le login/password (apparemment, encoder en Base64 comme je le dis plus haut marche bien) et le coup du certificat que chu en train de creuser
Marsh Posté le 02-02-2004 à 11:55:12
benou a écrit : d'après cet article, tu ne dois pas mettre BASIC devant les données d'identification ... |
D'la connerie (sauf ton respect ). Si j'fous pas Basic, ici, le proxy m'envoie chier. Je pense que ça dépend du type de proxy et de sa configuration.
Marsh Posté le 02-02-2004 à 12:00:41
Taiche a écrit : Bon bin j'passe bien le proxy !@# |
Salut,
Je pense que tu ne pouvais pas accéder à ton proxy en HTTPS car tu avais mis :
System.getProperties().put("http.proxySet", "true" );
System.getProperties().put("http.proxyHost", proxyHost);
System.getProperties().put("http.proxyPort", proxyPort);
au lieu de :
System.getProperties().put("https.proxySet", "true" );
System.getProperties().put("https.proxyHost", proxyHost);
System.getProperties().put("https.proxyPort", proxyPort);
Sauf erreur de ma part.
A+.
Marsh Posté le 02-02-2004 à 12:08:43
VinceG a écrit : |
Ouais non, t'as raison, mnais c'est surtout moi qui ai fait un mauvais copier/coller au début
J'modifie mon premier post, au cas où
Marsh Posté le 02-02-2004 à 12:57:23
Taiche a écrit : |
nan nan c'est standardisé ce genre de truc ... ca doit être une bourde de l'article plutot parce que de tyoute façon faut bien indiquer quel type d'authentification tu utilises ... J'avais pas cherché plus loin en te filant le lien ...
Marsh Posté le 02-02-2004 à 13:59:21
OOOOOOOOOOOOOOOK, maintenant j'ai tout qui marche
Bon alors, j'vais récapituler tout c'qu'il faut faire pour les gens que ça pourrait intéresser. Juste un truc à savoir : les certificats c'est relou
En fait, y a plusieurs points :
1) Préparation de la connexion
Il suffit de positionner les bonnes variables systèmes. Exemple :
Code :
|
(merci à VinceG au passage pour m'avoir corrigé dans mon copier/coller )
Pour une obscure raison encore inconnue, utiliser mon proxy spécial https (qui est configuré comme tel dans mon browser et qui marche bien) ne passe pas Bref, si vous avez des soucis de connec et plusieurs proxies, essayez les deux
2) Gestion des certificats
Là, c'est autre chose. Au début de l'établissement d'une connexion SSL, le client va aller récupérer un certificat émis par le serveur ; il s'agit d'un document contenant diverses infos pour dire "salut, moi c'est Untel, j'ai été approuvé par VeriSign ou une autre boîte de sécu et ils disent que chu gentil. Voici ma clé publique". Le tout, c'est que le client accepte ce certificat ou non (dans les browsers Ouaibe, vous vous mangez un jouli popup vous demandant si vous faites confiance au site, etc...). Depuis une applis Java, c'est autre chose.
En fait, dans le répertoire d'install de votre Java, y a un répertoire lib/security (ou jre/lib/security pour le JDK) qui contient un fichier nommé cacerts. C'est lui qui contient les certificats répertoriés comme valides. A l'établissement de la connexion, Java mate dans ce cacerts (par défaut, on peut lui en spécifier un autre via System.setProperty("javax.net.ssl.trustStore", "chemin/monFichierContenantMesCertifs" )) et si le certificat ne fait pas partie des ceretificats "trusted", bin vlan :
Citation : javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: Couldn't find trusted certificate |
Joie. Donc pour résoudre le problème, deux solutions, une chiante et une bourrin :
* vous rentrez le certif à la main en utilisant l'outil keytool (dans le bin de votre JDK ou JRE) et la page d'aide http://java.sun.com/products/jdk/1 [...] ytool.html
J'ai essayé, c'est relou et j'arrive pas à avoir toutes les infos M'enfin ça se fait.
* vous utilisez un javax.net.ssl.TrustManager customisé qui acceptera tous les certificats Ca se code en 2 coups de cuillère à pot et c'est bien pratique pour les bourrins comme moi qui savent que leur appli se connectera pas sur divers sites un peu chelous. Maintenant, si vous codez un browser, c'est pas vraiment la solution la plus propre
Exemple de bout de code avec le TrustManager trafiqué (récupéreud sur les forums de java.sun) :
Code :
|
Ouais, mes catchs sont crades et j'vous emmerde
3) Mise en place de la connexion
Bin là, pas grand-chose à faire ; un coup d'URLConnection, on sette le login/password du proxy et hop, roulaize. Exemple :
Code :
|
Alors évidemment, il faut une classe qui gère le Base64 (y a pas dans le Java de base, merci Sun et encore bravo). Chu en train de mater les histoires de PasswordAuthentication de java.net ; si ça s'trouve, ça mâche le boulot du Base64. J'ferai un ajout ici si nécessaire.
4) Récupération du résultatet Noël
Bin rien de mieux à faire que choper le code de retour ou l'InputStream avec getResponseCode() ou getInputStream()
Un pitit bout de code kivabien et qui fait tout ça :
Code :
|
(idem, mes catchs sont crades, m'en branle )
5) Divers
L'insertion de la ligne System.getProperties().put("javax.net.debug", "ssl" ); aide bien pour les histoires de certificats
EDIT : oh putain, l'indentation
Marsh Posté le 02-02-2004 à 14:11:21
Taiche a écrit : Alors évidemment, il faut une classe qui gère le Base64 (y a pas dans le Java de base, merci Sun et encore bravo). Chu en train de mater les histoires de PasswordAuthentication de java.net ; si ça s'trouve, ça mâche le boulot du Base64. J'ferai |
y a pas dans l'API java. Y a des classes cachées qui le font dans com.sun.bazard, mais c'est mal
solution ici : http://jakarta.apache.org/commons/codec/
Marsh Posté le 02-02-2004 à 14:11:39
ReplyMarsh Posté le 02-02-2004 à 14:16:35
Benou, Darque :
Sinon, pour l'authentification, on peut effectivement utiliser le couple Authenticator/PasswordAuthentication de java.net. Du coup, exit les Base64 et les preé-requis externes.
Exemple :
Code :
|
On met tout ça à la place des 3-4 lignes qui gèrent la chaîne d'authentification et hop
'fin en tout cas, chezmoicamarche.org
Marsh Posté le 02-02-2004 à 14:29:07
Taiche a écrit : |
Code :
|
Marsh Posté le 02-02-2004 à 14:35:02
lorill a écrit :
|
Ui, faut passer par l'internal, j'imagine bien que le PasswordAuthentication il faisait pas ça de façon magique Pis le jour où t'utilises une JVM autre (genre IBM, au hasard, pour le fun), bin
Marsh Posté le 02-02-2004 à 14:37:07
Taiche a écrit : |
http://cvs.lucane.org/cgi-bin/view [...] cvs-markup
Marsh Posté le 02-02-2004 à 14:41:48
Ui nan mais y a 500 000 trucs qui font ça de par le Ouaibe, mais le top c'est quand même de ne se servir que de ce qu'il y a de dispo de base Spour ça que PasswordAuthentication c'est bien
Marsh Posté le 02-02-2004 à 15:51:53
Taiche a écrit : |
+1
je ne connaissais pas. Meci
et tant qu'à faire de prendre un truc externe, autant prendre le truc appache parce que apache c'est bien
Marsh Posté le 02-02-2004 à 19:49:48
Reply
Marsh Posté le 02-02-2004 à 11:05:58
Gron les gens !
J'ai déjà le même truc pour le HTTP de base et j'l'ai résolu avec des trucs du style
Bon alors vala, j'dois faire une pitite appli en 1.4 qui fait des requêtes HTTPS genre GET, POST, etc... Avec javax.net.ssl.HttpsUrlConnection, pas de souci pour ça.
Par contre, là où c'est moins rigolo, c'est que j'dois pouvoir passer un proxy
et du
pour l'authentification.
Le problème, c'est que si j'fais ça avec HttpsUrlConnection, bin j'me fais envoyer chier
J'ai cherché un brin sur Gougueule et toussa, mais j'trouve pas mal de messages sans réponses sur les forums ou alors plein de tutos qui te disent de setter les properties system (
Donc si vous avez des idées...
Message édité par Taiche le 02-02-2004 à 12:09:06
---------------
Everyone thinks of changing the world, but no one thinks of changing himself | It is the peculiar quality of a fool to perceive the faults of others and to forget his own | Early clumsiness is not a verdict, it’s an essential ingredient.