setproxy proxyhost exclude example configurar code behind java http proxy

proxyhost - Proxy HTTP autenticado con Java



proxy java example (7)

(EDITAR: Como lo señala el OP, también se requiere el uso de un java.net.Authenticator . Estoy actualizando mi respuesta en consecuencia por razones de corrección).

Para la autenticación, use java.net.Authenticator para establecer la configuración del proxy y establecer las propiedades del sistema http.proxyUser y http.proxyPassword .

final String authUser = "user"; final String authPassword = "password"; Authenticator.setDefault( new Authenticator() { @Override public PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication( authUser, authPassword.toCharArray()); } } ); System.setProperty("http.proxyUser", authUser); System.setProperty("http.proxyPassword", authPassword);

¿Cómo puedo configurar el nombre de usuario y la contraseña para autenticar un servidor proxy http utilizando Java?

Acabo de encontrar los siguientes parámetros de configuración:

http.proxyHost=<proxyAddress> http.proxyPort=<proxyPort> https.proxyHost=<proxyAddress> https.proxyPort=<proxyPort>

Pero, mi servidor proxy requiere autenticación. ¿Cómo puedo configurar mi aplicación para usar el servidor proxy?


La mayoría de la respuesta está ahí, pero para mí no del todo. Esto es lo que funciona para mí con java.net.HttpURLConnection (he probado todos los casos con JDK 7 y JDK 8). Tenga en cuenta que no tiene que usar la clase Authenticator.

Caso 1: Proxy sin autenticación de usuario, acceso a recursos HTTP

-Dhttp.proxyHost=myproxy -Dhttp.proxyPort=myport

Caso 2: Proxy con autenticación de usuario, acceso a recursos HTTP

-Dhttp.proxyHost=myproxy -Dhttp.proxyPort=myport -Dhttps.proxyUser=myuser -Dhttps.proxyPassword=mypass

Caso 3: Proxy sin autenticación de usuario, acceso a recursos HTTPS (SSL)

-Dhttps.proxyHost=myproxy -Dhttps.proxyPort=myport

Caso 4: Proxy con autenticación de usuario, acceso a recursos HTTPS (SSL)

-Dhttps.proxyHost=myproxy -Dhttps.proxyPort=myport -Dhttps.proxyUser=myuser -Dhttps.proxyPassword=mypass

Caso 5: Proxy sin autenticación de usuario, acceso a recursos HTTP y HTTPS (SSL)

-Dhttp.proxyHost=myproxy -Dhttp.proxyPort=myport -Dhttps.proxyHost=myproxy -Dhttps.proxyPort=myport

Caso 6: Proxy con autenticación de usuario, acceso a recursos HTTP y HTTPS (SSL)

-Dhttp.proxyHost=myproxy -Dhttp.proxyPort=myport -Dhttp.proxyUser=myuser -Dhttp.proxyPassword=mypass -Dhttps.proxyHost=myproxy -Dhttps.proxyPort=myport -Dhttps.proxyUser=myuser -Dhttps.proxyPassword=mypass

Puede establecer las propiedades en el con System.setProperty ("clave", "valor" también).

Para acceder al recurso HTTPS, puede que tenga que confiar en el recurso descargando el certificado del servidor y guardándolo en un almacén de confianza y luego usando ese almacén de confianza. es decir

System.setProperty("javax.net.ssl.trustStore", "c:/temp/cert-factory/my-cacerts"); System.setProperty("javax.net.ssl.trustStorePassword", "changeit");


Para Java 1.8 y superior debe configurar

-Djdk.http.auth.tunneling.disabledSchemes =

para hacer proxies con autorización básica trabajando con https junto con Authenticator como se menciona en la respuesta aceptada


Pero, al configurar solo esos parámetros, la autenticación no funciona.

Es necesario agregar a ese código lo siguiente:

final String authUser = "myuser"; final String authPassword = "secret"; System.setProperty("http.proxyHost", "hostAddress"); System.setProperty("http.proxyPort", "portNumber"); System.setProperty("http.proxyUser", authUser); System.setProperty("http.proxyPassword", authPassword); Authenticator.setDefault( new Authenticator() { public PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(authUser, authPassword.toCharArray()); } } );


Prueba este corredor que escribí. Podría ser útil

import java.io.InputStream; import java.lang.reflect.Method; import java.net.Authenticator; import java.net.PasswordAuthentication; import java.net.URL; import java.net.URLConnection; import java.util.Scanner; public class ProxyAuthHelper { public static void main(String[] args) throws Exception { String tmp = System.getProperty("http.proxyUser", System.getProperty("https.proxyUser")); if (tmp == null) { System.out.println("Proxy username: "); tmp = new Scanner(System.in).nextLine(); } final String userName = tmp; tmp = System.getProperty("http.proxyPassword", System.getProperty("https.proxyPassword")); if (tmp == null) { System.out.println("Proxy password: "); tmp = new Scanner(System.in).nextLine(); } final char[] password = tmp.toCharArray(); Authenticator.setDefault(new Authenticator() { @Override protected PasswordAuthentication getPasswordAuthentication() { System.out.println("/n--------------/nProxy auth: " + userName); return new PasswordAuthentication (userName, password); } }); Class<?> clazz = Class.forName(args[0]); Method method = clazz.getMethod("main", String[].class); String[] newArgs = new String[args.length - 1]; System.arraycopy(args, 1, newArgs, 0, newArgs.length); method.invoke(null, new Object[]{newArgs}); } }


Ya casi estás allí, solo tienes que anexar:

-Dhttp.proxyUser=someUserName -Dhttp.proxyPassword=somePassword


http://rolandtapken.de/blog/2012-04/java-process-httpproxyuser-and-httpproxypassword dice:

Otros sugieren utilizar un autenticador predeterminado personalizado. Pero eso es peligroso porque enviará su contraseña a cualquiera que pregunte.

Esto es relevante si algunas solicitudes http / https no pasan por el proxy (lo cual es bastante posible dependiendo de la configuración). En ese caso, enviaría sus credenciales directamente a algún servidor http, no a su proxy.

Él sugiere la siguiente solución.

// Java ignores http.proxyUser. Here come''s the workaround. Authenticator.setDefault(new Authenticator() { @Override protected PasswordAuthentication getPasswordAuthentication() { if (getRequestorType() == RequestorType.PROXY) { String prot = getRequestingProtocol().toLowerCase(); String host = System.getProperty(prot + ".proxyHost", ""); String port = System.getProperty(prot + ".proxyPort", "80"); String user = System.getProperty(prot + ".proxyUser", ""); String password = System.getProperty(prot + ".proxyPassword", ""); if (getRequestingHost().equalsIgnoreCase(host)) { if (Integer.parseInt(port) == getRequestingPort()) { // Seems to be OK. return new PasswordAuthentication(user, password.toCharArray()); } } } return null; } });

No lo he probado todavía, pero me parece bien.

Modifiqué ligeramente la versión original para usar equalsIgnoreCase () en lugar de equals (host.toLowerCase ()) debido a esto: http://mattryall.net/blog/2009/02/the-infamous-turkish-locale-bug y yo se agregó "80" como valor predeterminado para el puerto para evitar NumberFormatException en Integer.parseInt (port).