Как использовать Proximo в качестве SOCKS-прокси в Java?

У меня есть приложение Java, работающее на Heroku, которому требуется доступ к Salesforce, который разрешает доступ к API только с IP-адресов, которые вы внесли в белый список. Proximo — это надстройка Heroku, которая позволяет проксировать все запросы, которые делает ваше приложение, через один сервер со статическим IP. К сожалению, стандартный способ сделать это — запустить приложение внутри оболочки Proximo — портит создание прослушивающего сокета для веб-сервера моего приложения, как кажется многим .

Как я могу использовать Proximo в качестве SOCKS-прокси в своем Java-приложении?


person Drew Stephens    schedule 19.02.2014    source источник


Ответы (2)


Я посмотрел тот стеклет, который они распространяют как вышеупомянутую обертку, и увидел, что он подключается к Proximo сервер в качестве SOCKS-прокси. Это легко сделать на Java, поэтому я добавил это в автозагрузку своего приложения (синтаксис Groovy):

URL proximo = new URL(System.getenv('PROXIMO_URL')
String userInfo = proximo.getUserInfo()
String user = userInfo.substring(0, userInfo.indexOf(':'))
String password = userInfo.substring(userInfo.indexOf(':') + 1)
System.setProperty('socksProxyHost', proximo.getHost())
System.setProperty('socksProxyPort', '1080')
Authenticator.setDefault(new ProxyAuth(user, password))

Поскольку этот ProxyAuth является внутренним классом в другом месте:

private class ProxyAuth extends Authenticator {
    private PasswordAuthentication passwordAuthentication;

    private ProxyAuth(String user, String password) {
        passwordAuthentication = new PasswordAuthentication(user, password.toCharArray())
    }

    @Override
    protected PasswordAuthentication getPasswordAuthentication() {
        return passwordAuthentication;
    }
}
person Drew Stephens    schedule 19.02.2014

Какое веб-приложение на основе Java описано здесь? У меня есть веб-приложение на основе Spring MVC, в котором возникают те же проблемы, что и здесь.

Я попробовал 2 способа настроить прокси-сервер SOCKS в своем приложении:

  1. Использование аргументов JVM командной строки.
  2. Используя упомянутый здесь код Java, завернутый в Bean-компонент, который я загружаю в свой корневой контекст приложения.

Мой класс Java загружается как bean-компонент:

package be.example.backend.configuration;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.net.Authenticator;
import java.net.MalformedURLException;
import java.net.PasswordAuthentication;
import java.net.URL;

public class ProximoSocksConfig {

    private static final Logger LOGGER = LoggerFactory.getLogger(ProximoSocksConfig.class);
    private static final String PROXIMO_ENV_VAR = "PROXIMO_URL";
    private static final String PROXIMO_PORT = "1080";

    public ProximoSocksConfig() throws MalformedURLException {
        setup();
    }

    /**
     * Setup Proximo proxying
     *
     * @return True if Proximo was configured, false if the Proximo environment variable was not found
     */
    public static boolean setup() throws MalformedURLException {

        String proximoUrl = System.getenv(PROXIMO_ENV_VAR);

        if (proximoUrl != null) {
            URL proximo = new URL(proximoUrl);

            String userInfo = proximo.getUserInfo();
            String user = userInfo.substring(0, userInfo.indexOf(':'));
            String password = userInfo.substring(userInfo.indexOf(':') + 1);
            String host = proximo.getHost();

            System.setProperty("socksProxyHost", host);
            System.setProperty("socksProxyPort", PROXIMO_PORT);

            Authenticator.setDefault(new ProxyAuth(user, password));
            LOGGER.info("{} specified; using <{}:{}> {}:{} as SOCKS proxy", PROXIMO_ENV_VAR, user, password, host,
                    PROXIMO_PORT);
            return true;
        }

        LOGGER.info("{} environment variable not set", PROXIMO_ENV_VAR);
        return false;
    }

    private static class ProxyAuth extends Authenticator {

        private final PasswordAuthentication passwordAuthentication;

        private ProxyAuth(String user, String password) {
            passwordAuthentication = new PasswordAuthentication(user, password.toCharArray());
        }

        @Override
        protected PasswordAuthentication getPasswordAuthentication() {
            return passwordAuthentication;
        }
    }
}

Мой корневой контекст приложения на основе XML:

<!-- Proximo SOCKS proxy configuration -->
<bean id="proximoSocksConfig" class="be.example.backend.configuration.ProximoSocksConfig"/>

Я больше не получаю ошибку привязки, потому что бинарная оболочка proximo больше не используется, но мое приложение недоступно по общедоступному IP-адресу, предоставленному Proximo (я использую пакет Proximo Starters).

person Boeboe    schedule 17.12.2014