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