Proxy HTTP authentifié avec Java

Comment configurer le nom d’utilisateur et le mot de passe pour authentifier un serveur proxy http en utilisant Java?

Je viens de trouver les parameters de configuration suivants:

http.proxyHost= http.proxyPort= https.proxyHost= https.proxyPort= 

Mais, mon serveur proxy requirejs une authentification. Comment configurer mon application pour utiliser le serveur proxy?

(EDIT: Comme indiqué par l’OP, l’utilisation d’un java.net.Authenticator est également requirejse. Je mets à jour ma réponse pour des raisons d’exactitude.)

Pour l’authentification, utilisez java.net.Authenticator pour définir la configuration du proxy et définissez les propriétés système http.proxyUser et http.proxyPassword .

 final Ssortingng authUser = "user"; final Ssortingng 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); 

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

D’autres suggèrent d’utiliser un authentificateur par défaut personnalisé. Mais c’est dangereux car cela enverrait votre mot de passe à toute personne qui le demande.

Ceci est pertinent si certaines requêtes http / https ne passent pas par le proxy (ce qui est tout à fait possible selon la configuration). Dans ce cas, vous enverriez vos informations d’identification directement à un serveur http, pas à votre proxy.

Il suggère le correctif suivant.

 // Java ignores http.proxyUser. Here come's the workaround. Authenticator.setDefault(new Authenticator() { @Override protected PasswordAuthentication getPasswordAuthentication() { if (getRequestorType() == RequestorType.PROXY) { Ssortingng prot = getRequestingProtocol().toLowerCase(); Ssortingng host = System.getProperty(prot + ".proxyHost", ""); Ssortingng port = System.getProperty(prot + ".proxyPort", "80"); Ssortingng user = System.getProperty(prot + ".proxyUser", ""); Ssortingng 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; } }); 

Je ne l’ai pas encore essayé, mais ça me semble bien.

J’ai légèrement modifié la version originale pour utiliser equalsIgnoreCase () au lieu de equals (host.toLowerCase ()) à cause de cela: http://mattryall.net/blog/2009/02/the-infamous-turkish-locale-bug et moi ajouté “80” comme valeur par défaut pour le port afin d’éviter l’exception NumberFormatException dans Integer.parseInt (port).

Vous êtes presque là, il vous suffit d’append:

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

Mais, en définissant uniquement ces parameters, l’authentification ne fonctionne pas.

Sont nécessaires pour append à ce code les éléments suivants:

 final Ssortingng authUser = "myuser"; final Ssortingng 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()); } } ); 

La plupart des réponses sont là, mais pour moi pas tout à fait. C’est ce qui fonctionne pour moi avec java.net.HttpURLConnection (j’ai testé tous les cas avec JDK 7 et JDK 8). Notez que vous n’avez pas besoin d’utiliser la classe Authenticator.

Cas 1: Proxy sans authentification de l’utilisateur, accédez aux ressources HTTP

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

Cas 2: Proxy avec authentification utilisateur, access aux ressources HTTP

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

Cas 3: Proxy sans authentification utilisateur, accédez aux ressources HTTPS (SSL)

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

Cas 4: Proxy avec authentification utilisateur, access aux ressources HTTPS (SSL)

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

Cas 5: Proxy sans authentification utilisateur, accédez aux ressources HTTP et HTTPS (SSL)

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

Cas 6: Proxy avec authentification utilisateur, accédez aux ressources HTTP et 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 

Vous pouvez également définir les propriétés avec System.setProperty (“key”, “value).

Pour accéder à la ressource HTTPS, vous devrez peut-être faire confiance à la ressource en téléchargeant le certificate du serveur et en l’enregistrant dans un magasin de clés de confiance, puis en utilisant ce magasin de clés de confiance. c’est à dire

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

Essayez ce coureur que j’ai écrit. Cela pourrait être utile.

 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(Ssortingng[] args) throws Exception { Ssortingng tmp = System.getProperty("http.proxyUser", System.getProperty("https.proxyUser")); if (tmp == null) { System.out.println("Proxy username: "); tmp = new Scanner(System.in).nextLine(); } final Ssortingng 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", Ssortingng[].class); Ssortingng[] newArgs = new Ssortingng[args.length - 1]; System.arraycopy(args, 1, newArgs, 0, newArgs.length); method.invoke(null, new Object[]{newArgs}); } } 

Pour Java 1.8 et versions ultérieures, vous devez définir

-Djdk.http.auth.tunneling.disabledSchemes =

créer des proxies avec autorisation de base fonctionnant avec https avec Authenticator comme mentionné dans la réponse acceptée