Настройка прокси в Java

Прокси в Java через HttpClient: ProxySelector и Authenticator, свойство jdk.http.auth.tunneling.disabledSchemes против ошибки 407, SOCKS5 и белый список IP.

Обновлено · Редакция Prokso

Данные для подключения
Хост
gw.prokso.com
Порт
823 HTTP · 824 SOCKS5 — новый IP на каждый запрос · 10000–20000 фиксированный IP (sticky-сессия), HTTP(S) и SOCKS5
Логин и пароль
в кабинете, на странице плана

Готовые строки в нужном формате генерирует кабинет: выберите страну, тип IP и протокол.

Коротко
  • Хост — gw.prokso.com, порты 823 (HTTP), 824 (SOCKS5), 10000–20000 (фиксированный IP, HTTP или SOCKS5)
  • Логин и пароль — в кабинете на странице плана
  • Проверяйте IP в ответе самого запроса через прокси: страница «Мой IP» в браузере ваш скрипт не проверяет

Пошаговая инструкция, как подключить прокси Prokso в Java. Займёт несколько минут.

Шаг 1. Возьмите данные прокси в кабинете

Откройте план и скопируйте хост gw.prokso.com, порт, логин и пароль. Порт 823 — HTTP, 824 — SOCKS5 (оба дают новый IP на каждый запрос); порты 10000–20000 — фиксированный IP до 120 минут, работают и как HTTP, и как SOCKS5 (каждый порт — отдельный адрес). Страну задают в логине: логин__cr.ua.

Шаг 2. Возьмите Java 11 или новее

Пример использует встроенный java.net.http.HttpClient, который есть в JDK с версии 11. Сторонние библиотеки не нужны.

Шаг 3. Включите Basic-авторизацию для туннеля

По умолчанию JDK не отправляет логин и пароль прокси, когда открывает https-сайт через туннель, и запрос падает с ошибкой 407. Это включает системное свойство jdk.http.auth.tunneling.disabledSchemes с пустым значением. Задайте его в самом начале программы, как в примере, или параметром запуска -Djdk.http.auth.tunneling.disabledSchemes=.

import java.net.Authenticator;
import java.net.InetSocketAddress;
import java.net.PasswordAuthentication;
import java.net.ProxySelector;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.time.Duration;

public class Main {
    public static void main(String[] args) throws Exception {
        System.setProperty("jdk.http.auth.tunneling.disabledSchemes", "");

        HttpClient client = HttpClient.newBuilder()
                .proxy(ProxySelector.of(new InetSocketAddress("gw.prokso.com", 823)))
                .authenticator(new Authenticator() {
                    @Override
                    protected PasswordAuthentication getPasswordAuthentication() {
                        return new PasswordAuthentication("ЛОГИН", "ПАРОЛЬ".toCharArray());
                    }
                })
                .connectTimeout(Duration.ofSeconds(30))
                .build();

        HttpRequest request = HttpRequest.newBuilder(URI.create("https://api.ipify.org?format=json")).build();
        System.out.println(client.send(request, HttpResponse.BodyHandlers.ofString()).body());
    }
}

Шаг 4. Передайте прокси и логин клиенту

Адрес прокси задаёт ProxySelector.of, а логин и пароль — Authenticator. HttpClient сам ответит на запрос авторизации от прокси. Создайте клиент один раз и используйте для всех запросов.

Шаг 5. SOCKS5 и фиксированный IP

HttpClient работает только с HTTP-прокси. Для SOCKS5 понадобится более старый HttpURLConnection с java.net.Proxy типа SOCKS на порту 824 и тот же Authenticator, установленный через Authenticator.setDefault. Для серии запросов с одного IP замените порт на фиксированный 10000–20000.

Шаг 6. Если соединение не устанавливается

Сверьте хост gw.prokso.com, порт и схему: HTTP на 823, SOCKS5 на 824, на портах 10000–20000 — оба. Ошибка 407 означает неверный логин или пароль либо закончившийся трафик: проверьте остаток на странице плана в кабинете. Таймаут чаще всего значит, что порт введён с ошибкой или клиент ждёт другой протокол. Если работаете с доступом по IP, убедитесь, что в белый список добавлен внешний адрес именно той машины, где запускается код.

Шаг 7. Проверьте вывод

Запустите пример: программа обращается к https://api.ipify.org и печатает IP, который видит сайт. Это должен быть адрес прокси, а не ваш. Ошибка 407 означает неверный логин или пароль либо закончившийся трафик на плане. Страница «Мой IP» в браузере здесь не поможет: браузер идёт напрямую.

Вопросы и ответы

Почему ошибка 407, хотя логин верный?

Чаще всего не задано свойство <code>jdk.http.auth.tunneling.disabledSchemes</code>: тогда JDK не отправляет логин для https-сайтов. Задайте его до создания клиента или параметром <code>-D</code> при запуске.

Можно ли обойтись без логина?

Да. Включите в плане доступ по IP (белый список) и добавьте адрес сервера, на котором работает программа. Тогда <code>Authenticator</code> и системное свойство не нужны.

Какой порт выбрать?

Порт 823 (HTTP) или 824 (SOCKS5) даёт новый IP на каждый запрос — удобно для сбора данных. Порт 10000–20000 держит один IP до 120 минут — для сессий со входом в аккаунт. На план приходится до 1000 одновременных соединений.

Как выбрать страну?

Страна записана в логине прокси. Сгенерируйте в кабинете строку для нужной страны и подставьте в код логин из неё — остальной адрес не меняется.

Что делать, если часть запросов падает?

При сборе данных отдельные адреса бывают медленными или недоступными. Добавьте в код несколько повторных попыток с паузой: на порту 823 или 824 каждая попытка пойдёт уже с нового адреса.