与Java身份验证的HTTP代理(Authenticated HTTP proxy with Jav

2019-09-01 07:14发布

如何配置用户名和密码进行身份验证使用Java HTTP代理服务器?

我刚刚发现了以下配置参数:

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

但是,我的代理服务器需要认证。 如何配置我的应用程序使用的代理服务器?

Answer 1:

(编辑:正如OP指出的那样,使用java.net.Authenticator需要过我相应地更新我的回答是否正确的缘故。)

对于身份验证,使用java.net.Authenticator设置代理服务器的配置和设置系统属性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);


Answer 2:

你几乎没有,你只需要添加:

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


Answer 3:

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

其他建议使用自定义的默认身份验证。 但是,这是危险的,因为这将您的密码发送给任何人谁问。

这是相关的,如果一些HTTP / HTTPS请求不通过代理服务器(这是很可能取决于配置)。 在这种情况下,你会直接发送您的凭据某些HTTP服务器,而不是您的代理。

他建议以下修补程序。

// 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(),而不是平等的,因为这(host.toLowerCase()): http://mattryall.net/blog/2009/02/the-infamous-turkish-locale-bug和我添加的“80”作为端口的默认值,以避免在的Integer.parseInt(端口)NumberFormatException异常。



Answer 4:

大多数的答案是在现有的答复,但对我来说不是很。 这对我有什么可与java.net.HttpURLConnection中(我已经测试所有JDK 7和JDK 8例)。 请注意,您不必使用验证器类。

案例1:代理无需用户认证,访问HTTP资源

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

案例2:代理与用户身份验证,访问HTTP资源

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

案例3:代理无需用户认证,访问HTTPS资源(SSL)

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

案例4:代理服务器与用户身份验证,访问HTTPS资源(SSL)

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

案例5:代理服务器,而无需用户认证,访问HTTP和HTTPS资源(SSL)

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

案例6:代理与用户身份验证,访问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(“键”,“值)也设置在了性能。

要访问HTTPS资源,你可能必须通过下载服务器证书并将其保存在一个信任存储,然后使用该信任存储信任资源。 即

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


Answer 5:

但是,设置只参数,认证不工作。

是必要的,添加到代码如下:

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


Answer 6:

对于Java 1.8和更高的必须设置

-Djdk.http.auth.tunneling.disabledSchemes =

做代理与基本授权以https工作以及认证者在接受答复中提到



Answer 7:

试试这个亚军我写的。 这可能是有益的。

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

}


文章来源: Authenticated HTTP proxy with Java
标签: java http proxy