Подтвердить что ты не робот

Проиллюстрированный HTTP-прокси с Java

Как настроить имя пользователя и пароль для аутентификации HTTP-прокси-сервера с помощью Java?

Я только что нашел следующие параметры конфигурации:

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

Но мой прокси-сервер требует аутентификации. Как настроить приложение для использования прокси-сервера?

4b9b3361

Ответ 1

(EDIT: Как указано OP, требуется также использовать java.net.Authenticator. Я корректирую свой ответ соответственно ради правильности.)

Для аутентификации используйте java.net.Authenticator, чтобы установить конфигурацию прокси-сервера и установить системные свойства http.proxyUser и 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);

Ответ 2

Вы почти там, вам просто нужно добавить:

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

Ответ 3

http://rolandtapken.de/blog/2012-04/java-process-httpproxyuser-and-httpproxypassword говорит:

Другие предлагают использовать пользовательский аутентификатор по умолчанию. Но это опасно, потому что это отправит ваш пароль любому, кто спрашивает.

Это актуально, если некоторые HTTP/HTTPS-запросы не проходят через прокси-сервер (что вполне возможно в зависимости от конфигурации). В этом случае вы отправляете свои учетные данные непосредственно на какой-либо http-сервер, а не на свой прокси.

Он предлагает следующее исправление.

// Java ignores http.proxyUser. Here come 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, и я добавил "80" как значение по умолчанию для порта, чтобы избежать NumberFormatException в Integer.parseInt(порт).

Ответ 4

Большая часть ответа находится в существующих ответах, но для меня не совсем. Это то, что работает для меня с java.net.HttpURLConnection (я проверил все случаи с JDK 7 и JDK 8). Обратите внимание, что вам не нужно использовать класс Authenticator.

Случай 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");

Ответ 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());
    }
  }
);

Ответ 6

Для Java 1.8 и выше вы должны установить

-Djdk.http.auth.tunneling.disabledSchemes =

сделать прокси с базовой авторизацией, работающей с https вместе с Authenticator, как указано в принятом ответе

Ответ 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});
    }

}