Question

Je dois configurer l'authentification par procuration contre un proxy SOCKS. J'ai trouvé ce message donner des instructions qui semblent fonctionner avec un proxy HTTP commun.

        httpclient.getHostConfiguration().setProxy("proxyserver.example.com", 8080);

        HttpState state = new HttpState();
        state.setProxyCredentials(new AuthScope("proxyserver.example.com", 8080), 
           new UsernamePasswordCredentials("username", "password"));
        httpclient.setState(state);

Est-ce que ce travail avec SOCKS procurations aussi bien ou dois-je faire quelque chose de différent?

Était-ce utile?

La solution

Le Caractéristiques d'Apache HTTPClient dit:

  

connexions transparente à travers SOCKS proxy (version 4 et 5) à l'aide de support de douille de Java native.

« transparent », je suppose qu'ils veulent dire que cela fonctionne sans que vous ayez besoin de faire quelque chose de spécial. Avez-vous un proxy SOCKS disponible quelque part? Tu ne peux pas juste essayer pour voir si cela fonctionne?

Autres conseils

Java prend en charge la configuration proxy Sock via les préférences:

  • socksProxyHost pour le nom d'hôte du serveur proxy SOCKS
  • socksProxyPort pour le numéro de port, la valeur par défaut étant 1080

par exemple.

java -DsocksProxyHost=socks.mydomain.com

( modifier ) Pour votre exemple, si le proxy socks a été configuré de la manière décrite précédemment:

httpclient.getHostConfiguration().setProxy("proxyserver.example.com", 8080);
Credentials cred = new UsernamePasswordCredentials("username","password");
httpclient.getState().setProxyCredentials(AuthScope.ANY, cred); 

Vous pouvez également utiliser cette variante (sans httpclient):

SocketAddress addr = new
InetSocketAddress("webcache.mydomain.com", 8080);
Proxy proxy = new Proxy(Proxy.Type.SOCKS, addr); // Type.HTTP for HTTP

complétant ainsi l'exemple précédent, nous pouvons maintenant ajouter:

URL url = new URL("http://java.sun.com/");
URConnection conn = url.openConnection(proxy);

HTH

SOCKS ne sont pas pris en charge par HttpClient 3 nativement. Vous pouvez essayer le support SOCKS comme suggéré par JDK autres. L'effet secondaire est que l'ensemble de votre machine virtuelle passera par le même proxy SOCKS.

Java 5 prend en charge l'authentification Nom d'utilisateur / mot de passe dans SOCKS (type 2). Tout ce que vous devez faire est de configurer le authentificateur comme ça,

Authenticator.setDefault(new Authenticator() {
    protected PasswordAuthentication getPasswordAuthentication() {
        return new PasswordAuthentication(username, password.toCharArray());
    }
});

Encore une fois, cela peut ne pas fonctionner pour vous, car il affecte toutes les authentifications dans votre machine virtuelle Java (HTTP auth, Proxy Auth).

Vous pouvez fournir une usine de prise personnalisée qui implémente le protocole SOCKS, et l'enregistrer en tant que votre gestionnaire de protocole HTTP par défaut. Cette solution a une limitation similaire à celui tuergeist réponse ci-dessus a - il applique globalement, à toute connexion HTTP vous établir par HttpClient.

Si vous trouvez cela un problème, jetez un oeil à

J'ai essayé

System.setProperty("socksProxyHost", "socks.xyz.com");
System.setProperty("socksProxyPort", "1000");

et il fonctionne très bien.

scroll top