通过Javaauthentication的HTTP代理

我如何configuration用户名和密码来validation使用Java的HTTP代理服务器?

我刚刚发现了以下configuration参数:

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

但是,我的代理服务器需要authentication。 我怎样才能configuration我的应用程序使用代理服务器?

(编辑:正如OP所指出的,使用java.net.Authenticator也是必需的,为了正确,我正在更新我的答案。)

对于身份validation,请使用java.net.Authenticator来设置代理的configuration,并设置系统属性http.proxyUserhttp.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); 

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

其他build议使用自定义的默认身份validation器。 但这很危险,因为这会把你的密码发送给任何询问的人。

如果一些http / https请求不通过代理(这很可能取决于configuration),这是相关的。 在这种情况下,您将直接将您的凭据发送到某个http服务器,而不是您的代理。

他build议以下修复。

 // 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; } }); 

我还没有尝试过,但对我来说看起来不错。

我稍微修改了原来的版本,使用equalsIgnoreCase()而不是equals(host.toLowerCase()),因为这个: http ://mattryall.net/blog/2009/02/the-infamous-turkish-locale-bug和I添加“80”作为端口的默认值,以避免Integer.parseInt(port)中的NumberFormatException。

你几乎在那里,你只需要追加:

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

但是,只设置参数,authentication不起作用。

有必要添加到该代码如下:

 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()); } } ); 

大部分的答案都在那里,但对我来说并不完全。 这是什么对我来说java.net.HttpURLConnection(我testing了JDK 7和JDK 8的所有情况)。 请注意,您不必使用Authenticator类。

情况1:没有用户authentication的代理,访问HTTP资源

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

情况2:具有用户authentication的代理,访问HTTP资源

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

案例3:没有用户authentication的代理,访问HTTPS资源(SSL)

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

案例4:使用用户authentication的代理,访问HTTPS资源(SSL)

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

案例5:没有用户authentication的代理,访问HTTP和HTTPS资源(SSL)

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

案例6:使用用户authentication的代理,访问HTTP和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 

您也可以使用System.setProperty(“key”,“value)来设置属性。

要访问HTTPS资源,您可能必须信任该资源,方法是下载服务器证书并将其保存在信任存储中,然后使用该信任存储。 即

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

试试我写的这个跑步者。 这可能会有所帮助。

 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}); } } 

对于Java 1.8及更高版本,您必须设置

-Djdk.http.auth.tunneling.disabledSchemes =

如接受的答案中所述,使用基本授权使用https与Authenticator一起使用代理