2013-03-20 2 views
1

Хорошо, вот моя проблема.Как пройти через брандмауэр из java-программы

Я работаю над своей локальной рабочей станцией. У меня есть машина за брандмауэром, и мне нужно зайти на эту машину с java-кода. Для этого я хотел бы использовать библиотеку JSch. Если я ставлю эту машину IP-адрес в веб-браузере я перенаправлены на брандмауэре страницу входа в систему, и когда я ввожу свои учетные данные, я могу войти в эту машину с SSH с этим кодом:

public void authenticate(String ip, String user, String password) { 
    JSch jsch=new JSch(); 
    try { 
     Session session = jsch.getSession(user, ip, 22); 
     session.setPassword(password); 
     session.setUserInfo(new UserInfoImpl(password)); 
     session.connect(); 
     System.out.println("Yes!!"); 
     session.disconnect(); 
    } catch (JSchException e) { 
     e.printStackTrace(); 
    } 
} 

private class UserInfoImpl implements UserInfo{ 

    private String password; 
    public UserInfoImpl(String password){ 
     this.password = password; 
    } 

    @Override 
    public String getPassphrase() { return null;} 
    @Override 
    public String getPassword() {return password;} 
    @Override 
    public boolean promptPassphrase(String arg0) {return true;} 
    @Override 
    public boolean promptPassword(String arg0) {return true;} 
    @Override 
    public boolean promptYesNo(String arg0) {return true;} 
    @Override 
    public void showMessage(String arg0) {} 

} 

Но моя программа должна autmaticly логин и к брандмауэру. Если я использую telnet (порт 23) вместо ssh (порт 22) из ​​командной строки Windows, есть возможность войти в этот брандмауэр оттуда.

Можно ли подключиться к этому брандмауэру из кода Java (используя JSch или какую-либо другую библиотеку java)?

+0

Возможно, вы можете, но этот подход зависит от протокола вашей программы, с которой вы пытаетесь установить соединение. В Java есть библиотеки с такого низкого уровня, как сокеты, на такой высокий уровень, как Http Client. Итак, какой сервис или процесс вы подключаете? А какой протокол аутентификации используется для проверки подлинности брандмауэром? – bell0

ответ

2

Слепое подключение к порту 22, вероятно, не направит вас на веб-страницу брандмауэра, поэтому JSch не будет обрабатывать это для вас. Когда вы подключитесь, вы вызовете исключение. Поймайте это, а затем вы можете инициировать перенаправление брандмауэра с помощью обычного HTTP-порт 80 вызова, затем захватить перенаправление, проанализировать результат и отправить HTTP POST с данными правильной формы.

Если форма и адрес брандмауэра всегда совпадают, вы можете просто отправить POST непосредственно перед попыткой подключения к SSH.

Вы можете использовать стандартные классы для этого, см Java - sending HTTP parameters via POST method easily

0

Это довольно удивительно, что, как только вы войти в свой прокси-сервер, ваш могут получить доступ к порту 22 на удаленной машине, но в любом случае ...

JSch не поможет, но вы можете легко имитировать, что делает ваш веб-браузер в java, используя HTTP-клиент, который способен обрабатывать правильный механизм проверки подлинности прокси.

Начиная с Java 6, предоставленное URLConnection может обрабатывать NTLM (в дополнение к SOCKS и HTTP Proxies). В любом случае, я рекомендую пойти с HttpClient 4.2.x, который предоставит больше возможностей и гибкости, чтобы помочь вам отладить любую проблему.

Смежные вопросы