Come posso configurare HTTPClient per l'autenticazione con un proxy SOCKS?
-
21-09-2019 - |
Domanda
Ho bisogno di impostare l'autenticazione per procura contro un proxy SOCKS. Ho scoperto questo post dando istruzioni che appaiono a lavorare con i proxy HTTP comune.
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);
Vorrei che il lavoro con SOCKS deleghe così o devo fare qualcosa di diverso?
Soluzione
Il Caratteristiche pagina di Apache HTTPClient dice:
connessioni trasparenti attraverso proxy SOCKS (versione 4 e 5) con supporto nativo presa Java.
Con "trasparente", credo che significa che funziona senza la necessità di fare nulla di speciale. Hai un proxy SOCKS disponibile da qualche parte? Non puoi solo provare a vedere se funziona?
Altri suggerimenti
Java supporta Calze tramite le preferenze:
-
socksProxyHost
per il nome host del server proxy SOCKS -
socksProxyPort
per il numero di porta, il valore di default essendo1080
per es.
java -DsocksProxyHost=socks.mydomain.com
( modifica ) Per il vostro esempio, se il proxy SOCKS è stato configurato nel modo descritto in precedenza:
httpclient.getHostConfiguration().setProxy("proxyserver.example.com", 8080);
Credentials cred = new UsernamePasswordCredentials("username","password");
httpclient.getState().setProxyCredentials(AuthScope.ANY, cred);
È inoltre possibile utilizzare questa variante (senza httpclient):
SocketAddress addr = new
InetSocketAddress("webcache.mydomain.com", 8080);
Proxy proxy = new Proxy(Proxy.Type.SOCKS, addr); // Type.HTTP for HTTP
Quindi, completando l'esempio precedente, possiamo ora aggiungere:
URL url = new URL("http://java.sun.com/");
URConnection conn = url.openConnection(proxy);
HTH
SOCKS non è supportato da HttpClient 3 in modo nativo. Si può provare il supporto SOCKS in JDK come suggerito da altri. L'effetto collaterale è che tutta la vostra JVM passerà attraverso lo stesso proxy SOCKS.
Java 5 supporta nome utente / password di autenticazione in SOCKS (tipo 2). Tutto quello che dovete fare è configurare l'autenticatore come questo,
Authenticator.setDefault(new Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password.toCharArray());
}
});
Ancora una volta, questo potrebbe non funzionare per voi perché interessa tutto l'autenticazione nel vostro JVM (HTTP auth, Proxy Auth).
È possibile fornire una fabbrica presa personalizzato, che implementa il protocollo SOCKS, e registrarlo come il vostro gestore di protocollo HTTP predefinito. Questa soluzione ha una limitazione simile a tuergeist di risposta di cui sopra ha - si applica a livello globale, a qualsiasi connessione HTTP si stabilire attraverso HttpClient.
Se si trova questo un problema, dare un'occhiata a questo corrispondenza, dove Oleg suggerisce di utilizzare HttpClient 4.0, ma si riferisce anche ad un eventuale patch nella classe HostConfiguration per HttpClient 3.x.
Un'altra soluzione possibile, che è il mio preferito, è quello di scrivere un proxy HTTP involucro al proxy SOCKS.
Ho cercato
System.setProperty("socksProxyHost", "socks.xyz.com");
System.setProperty("socksProxyPort", "1000");
e sta funzionando bene.