Перейти к основному содержимому

Использование Maven за прокси

· 7 мин. чтения

1. Введение

В этом руководстве мы собираемся настроить Maven для работы за прокси-сервером — обычная ситуация в средах, где мы не подключаемся напрямую к Интернету.

В нашем примере наш прокси работает на машине «proxy.foreach.com» и прослушивает прокси-запросы через HTTP на порту «80». Мы также будем использовать некоторые внутренние сайты по адресу internal.foreach.com, где нам не нужно использовать прокси.

2. Конфигурация прокси

Во- первых, давайте настроим базовую конфигурацию прокси без каких-либо учетных данных .

Давайте отредактируем наш Maven settings.xml, который обычно находится в нашем каталоге « <user_home>/.m2» . Если его там еще нет, мы можем скопировать его из глобальных настроек в каталоге « <maven_home>/conf» .

А теперь давайте создадим запись <proxy> внутри секции < proxy > :

<proxies>
<proxy>
<host>proxy.foreach.com</host>
<port>80</port>
</proxy>
</proxies>

Поскольку мы также используем локальный сайт, которому не нужно проходить через прокси, давайте укажем его в <nonProxyHosts> с помощью '|' разделенный список с нашим локальным хостом:

<nonProxyHosts>internal.foreach.com|localhost|127.*|[::1]</nonProxyHosts>

3. Добавление учетных данных

Если бы наш прокси не был защищен, это все, что нам нужно; однако у нас есть, поэтому давайте добавим наши учетные данные в определение прокси :

<username>foreach</username>
<password>changeme</password>

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

Наша минимальная аутентифицированная конфигурация теперь должна выглядеть так:

<proxies>
<proxy>
<host>proxy.foreach.com</host>
<port>80</port>
<username>foreach</username>
<password>changeme</password>
<nonProxyHosts>internal.foreach.com|localhost|127.*|[::1]</nonProxyHosts>
</proxy>
</proxies>

Теперь, когда мы запустим команду mvn , мы будем использовать прокси-сервер для подключения к сайтам, которые нам нужны.

3.1. Дополнительные записи

Давайте присвоим ему необязательный идентификатор «ForEachProxy_Authenticated», чтобы упростить обращение к нему на случай, если нам когда-нибудь понадобится переключить прокси:

<id>ForEachProxy_Authenticated</id>

Теперь, если у нас есть другой прокси, мы можем добавить еще одно определение прокси, но активным может быть только один. По умолчанию Maven будет использовать первое найденное активное определение прокси .

Определения прокси активны по умолчанию и получают неявное определение:

<active>true</active>

Если бы мы хотели сделать другой прокси активным, мы бы деактивировали исходную запись, установив <active> в false:

<active>false</active>

Значение Maven по умолчанию для протокола прокси — HTTP , что подходит для большинства случаев. Если наш прокси использует другой протокол, мы объявим его здесь и заменим http протоколом, который нужен нашему прокси:

<protocol>http</protocol>

Обратите внимание, что это протокол, который использует прокси — протокол наших запросов (ftp://, http://, https://) не зависит от этого.

А вот как выглядит наше расширенное определение прокси , включая необязательные элементы:

<proxies>
<proxy>
<id>ForEachProxy_Authenticated</id>
<active>true</active>
<protocol>http</protocol>
<host>proxy.foreach.com</host>
<port>80</port>
<username>foreach</username>
<password>changeme</password>
<nonProxyHosts>internal.foreach.com|localhost|127.*|[::1]</nonProxyHosts>
</proxy>
</proxies>

Итак, это наш базовый прокси-сервер, но достаточно ли он безопасен для нас?

4. Защита нашей конфигурации

Теперь предположим, что один из наших коллег хочет, чтобы мы отправили ему нашу конфигурацию прокси.

Мы не слишком заинтересованы в отправке нашего пароля в виде простого текста, поэтому давайте посмотрим, насколько легко Maven позволяет шифровать наши пароли .

4.1. Создание мастер-пароля

Во-первых, давайте выберем мастер-пароль, скажем, «te!st!ma$ter».

Теперь давайте зашифруем наш мастер-пароль , введя его в подсказке при запуске:

mvn --encrypt-master-password
Master Password:

После того, как мы нажали ввод, мы видим наш зашифрованный пароль, заключенный в фигурные скобки:

{QFMlh/6WjF8H9po9UDo0Nv18e527jqWb6mUgIB798n4=}

4.2. Устранение неполадок при генерации пароля

Если мы видим {} вместо приглашения Master Password: (это может произойти при использовании bash), то нам нужно будет указать пароль в командной строке.

Давайте заключим пароль в кавычки, чтобы убедиться, что любые специальные символы, такие как '!' не иметь нежелательных эффектов.

Итак, давайте использовать одинарные кавычки, если мы используем bash:

mvn --encrypt-master-password 'te!st!ma$ter'

Или используйте двойные кавычки при использовании командной строки Windows:

mvn --encrypt-master-password "te!st!ma$ter"

Теперь иногда наш сгенерированный мастер-пароль содержит фигурные скобки , как в этом примере с закрывающей фигурной скобкой «}» после «UD»:

{QFMlh/6WjF8H9po9UD}0Nv18e527jqWb6mUgIB798n4=}

В этом случае мы можем:

  • снова запустите команду mvn –encrypt-master-password , чтобы сгенерировать еще один (надеюсь, без фигурной скобки)
  • избегайте фигурных скобок в нашем пароле, добавляя обратную косую черту перед '{' или ' }'

4.3. Создание файла settings-security.xml

Теперь давайте поместим наш зашифрованный пароль с экранированным '}' в файл с именем settings-security.xml в нашем каталоге .m2 :

<settingsSecurity>
<master>{QFMlh/6WjF8H9po9UD\}0Nv18e527jqWb6mUgIB798n4=}</master>
</settingsSecurity>

Наконец, Maven позволяет нам добавить комментарий внутри главного элемента.

Давайте добавим некоторый текст перед разделителем пароля '{', стараясь не использовать { или } в нашем комментарии, так как Maven использует их для поиска нашего пароля:

<master>We escaped the curly brace with '\' {QFMlh/6WjF8H9po9UD\}0Nv18e527jqWb6mUgIB798n4=}</master>

4.4. Использование съемного диска

Допустим, нам нужна дополнительная безопасность и мы хотим сохранить наш мастер-пароль на отдельном устройстве .

Во- первых, мы поместим наш файл settings-security.xml в каталог конфигурации на съемном диске «R:»:

R:\config\settings-security.xml

А теперь мы обновим файл settings-security.xml в нашем каталоге .m2 , чтобы перенаправить Maven на наш настоящий settings-security.xml на съемном диске:

<settingsSecurity>
  <relocation>R:\config\settings-security.xml</relocation>
</settingsSecurity>

Maven теперь будет считывать наш зашифрованный мастер-пароль из файла, который мы указали в элементе relocation , на нашем съемном диске.

5. Шифрование паролей прокси

Теперь у нас есть зашифрованный мастер-пароль, мы можем зашифровать пароль нашего прокси .

Давайте запустим следующую команду и введем наш пароль « changeme» в командной строке:

mvn --encrypt-password
Password:

Отображается наш зашифрованный пароль:

{U2iMf+7aJXQHRquuQq6MX+n7GOeh97zB9/4e7kkEQYs=}

Наш последний шаг — отредактировать раздел прокси в нашем файле settings.xml и ввести наш зашифрованный пароль :

<proxies>
<proxy>
<id>ForEachProxy_Encrypted</id>
<host>proxy.foreach.com</host>
<port>80</port>
<username>foreach</username>
<password>{U2iMf+7aJXQHRquuQq6MX+n7GOeh97zB9/4e7kkEQYs=}</password>
</proxy>
</proxies>

Сохраните это, и теперь Maven сможет подключаться к Интернету через наш прокси-сервер, используя наши зашифрованные пароли.

6. Использование свойств системы

Хотя рекомендуемым подходом является настройка Maven через файл настроек , мы можем объявить нашу конфигурацию прокси-сервера через свойства системы Java.

Если в нашей операционной системе уже настроен прокси-сервер, мы можем установить:

-Djava.net.useSystemProxies=true

В качестве альтернативы, чтобы он всегда был включен, если у нас есть права администратора, мы можем установить это в нашем файле <JRE>/lib/net.properties .

Однако давайте отметим, что, хотя сам Maven может учитывать этот параметр, не все плагины делают это, поэтому мы все равно можем получить неудачные соединения, используя этот метод.

Даже если он включен, мы можем переопределить его, установив данные нашего HTTP-прокси в системном свойстве http.proxyHost :

-Dhttp.proxyHost=proxy.foreach.com

Наш прокси прослушивает порт 80 по умолчанию, но если бы он прослушивал порт 8080, мы бы настроили свойство http.proxyPort :

-Dhttp.proxyPort=8080

И для наших сайтов, которым не нужен прокси :

-Dhttp.nonLocalHosts="internal.foreach.com|localhost|127.*|[::1]"

Итак, если наш прокси находится по адресу 10.10.0.100, мы можем использовать:

mvn compile -Dhttp.proxyHost=10.10.0.100 -Dhttp.proxyPort=8080 -Dhttp.nonProxyHosts=localhost|127.0.0.1

Конечно, если наш прокси требует аутентификации , мы также добавим :

-Dhttp.proxyUser=foreach
-Dhttp.proxyPassword=changeme

И если мы хотим, чтобы некоторые из этих настроек применялись ко всем нашим вызовам Maven, мы можем определить их в переменной среды MAVEN_OPTS:

set MAVEN_OPTS= -Dhttp.proxyHost=10.10.0.100 -Dhttp.proxyPort=8080

Теперь всякий раз, когда мы запускаем « mvn », эти настройки будут применяться автоматически — до тех пор, пока мы не выйдем.

7. Заключение

В этой статье мы настроили прокси-сервер Maven как с учетными данными, так и без них, а также зашифровали наш пароль. Мы увидели, как сохранить наш мастер-пароль на внешнем диске, а также рассмотрели настройку прокси-сервера с помощью системных свойств.

Теперь мы можем поделиться нашим файлом settings.xml с нашими коллегами, не сообщая им наши пароли в виде простого текста, и показать им, как шифровать их собственные!

Как обычно, примеры из этой статьи доступны на GitHub .