Как использовать Java для соединения с HTTP-серверами которые находятся вне зоны охвата корпоративного брандмауэра? В этой статье я хотел бы дать рекомендации, которые помогут вам писать Java-приложения, способные преодолевать корпоративные proxy-серверы и получать доступ к Web-серверам в Internet. Для обеспечения поддержки ваших Java-приложений proxy-серверами необходимо написать лишь нескольких дополнительных строчек кода. Решение этой задачи никак не связано с разного рода "лазейками" в системах безопасности.

Проблема защиты внутренней корпоративной сети от хакеров и похитителей информации волнует практически все компании. Одна из используемых ими мер безопасности предусматривает полное отсоединение корпоративной сети от Internet. Если злоумышленники не в состоянии соединиться ни с одной из ваших машин, то им не удастся и "взломать" их.

У этой тактики есть один минус - пользователи внутренней корпоративной сети не могут получать доступ к внешним Internet-серверам, например к Yahoo или JavaWorld. Для решения этой проблемы руководители информационных служб обычно устанавливают так называемый "уполномоченный (proxy) сервер". По существу, он представляет собой службу, которая находится между Internet и внутренней сетью и управляет соединениями между двумя мирами.

Proxy-серверы помогают снизить угрозу безопасности сети извне, и одновременно обеспечивают пользователям внутренних сетей доступ к службам Internet. Использование Java облегчает написание Internet-клиентов. Однако если эти клиенты не могут преодолеть proxy-сервер, пользы от них никакой. К счастью, Java позволяет облегчить и работу с proxy-серверами - если, конечно, вы знаете "волшебные слова".

Секрет обеспечения работы Java-приложений с proxy-серверами состоит в активизации определенных характеристик системы на этапе выполнения Java-приложений. Эти характеристики недокументированны и передаются из уст в уста, по секрету. Они стали составной частью фольклора Java-программистов. При работе с proxy-сервером ваше Java-приложения должно специфицировать информацию о самом proxy-сервере, а также пользовательскую информацию, необходимую для идентификации. Перед началом работы с каким-либо Internet-протоколом необходимо добавить в программу следующие строчки:

System.getProperties().put( "proxySet", "true" );
System.getProperties().put( "proxyHost",
"myProxyMachineName" ); System.getProperties().put( "proxyPort", "85" );

Первая строчка информирует Java-приложение, что вы будете использовать для соединений proxy-сервер. Вторая строчка определяет машину, на которой будет находится proxy-сервер. Третья указывает, с какого порта proxy-сервер будет ожидать сигнала. При использовании некоторых proxy-серверов для получения доступа к Internet необходимо ввести имя пользователя и пароль.

Если вы используете Web-браузер при наличии брандмауэра, то возможно, уже сталкивались с этим. Вот как следует проводить идентификацию:

URLConnection connection = url.openConnection();
String password = "username:password";
String encodedPassword = base64Encode( password );
connection.setRequestProperty( "Proxy-Authorization",
encodedPassword );

Смысл первого фрагмента кода состоит в том, что перед посылкой запроса вы должны соответствующим образом приспособить HTTP-заголовок. Этого можно добиться, используя вызов RequestProperty(). Данный метод позволяет управлять HTTP-заголовками до посылки запроса. Во-вторых, вы должны иметь в виду, что необходимо шифровать имя пользователя и пароль. При использовании HTTP следует применять шифр base64. К счастью, существует пара общедоступных API-интерфейсов, которые могут осуществить за вас все необходимое шифрование. Как вы видите, для обеспечения поддержки proxy-сервером вашего Java-приложения нужно не многое. Вы можете заставать свой proxy-сервер работать и с другими протоколами, например с FTP, однако для этого потребуется провести кое-какие изыскания. Вам придется самостоятельно выяснить, каким образом proxy-сервер управляет интересующим вас протоколом, и как в этом случае следует проводить идентификацию пользователя. Если кто-нибудь из читателей готов рассказать о примерах использования proxy-серверов с другими Internet-протоколами, я с удовольствием с ними ознакомлюсь.