Конфигурирование tomcat

Материал из Course Orchestra
Перейти к: навигация, поиск
Showcase

Создание решений на КУРС:Showcase

Проблемы с локалью (например, формат отображения дат)

Если формат отображения даты требуется русский (то есть в виде 10.02.2008), то в настройках запуска демона томката, рекомендуется прописать свойства JAVA_OPTS="$JAVA_OPTS $LOGGING_MANAGER -Duser.language=ru -Duser.region=RU"

Кодировка консоли portable tomcat под windows

Для корректного отображения кириллицы в консоли томката нужно сделать следующее: В файле C:\Program Files\apache-tomcat-7.0.8\bin\catalina.bat в конце 4 строчки, где происходит запуск, нужно перед %MAINCLASS% дописать -Dfile.encoding=cp866

Если это не помогло, то еще нужно в свойствах окна консоли поставить шрифт lucida console

Настройка web-сервера apache для проксирования на tomcat

Дано: Установлен томкат, слушает порт 8080.

Найти: способ установить на этот-же компьютер apche, например для размещения wiki-ресурса.

Решение: Будет осуществлена конфигурация: томкат по адресу hostname.com, веб-сервер по адресу hostname.com/mediawiki

  • 1.убедитесь что томкат корректно работает на порту 8080
  • 2.остановите томкат
  • 3.установите apache, сконифгурируйте ваше приложение, убедитесь в его работе по адресу hostname.com/mediawiki
  • 4.в конфигурации томкат (server.xml)
proxyPort="80"
proxyName="178.132.206.42"

в итоге элемент connector будет иметь вид

   <Connector port="8080" protocol="HTTP/1.1"^
                  connectionTimeout="20000"^
                  compression="on"
                  compressionMinSize="1000"
                  noCompressionUserAgents="gozilla, traviata"
                  compressableMimeType="text/html,text/xml,text/plain,text/javascript,text/css,
application/x-javascript,application/javascript,application/octet-stream"

                  redirectPort="8443"
                  proxyPort="80"
                  proxyName="hostname.com"
       />
Обратите внимание, тут еще включен gzip, что является обязательным для нормальных решений
  • 5. В настройки apache(httpd.conf) вносим
   <VirtualHost *:80>
           ServerName hostname.com
          <Proxy *>
               Order deny,allow
               Allow from all
          </Proxy>
           ProxyPreserveHost On
           ProxyPass /mediawiki !
           ProxyPass / http://hostname.com:8080/
           ProxyPassReverse / http://hostname.com:8080/
   </VirtualHost>
  • 6.запускаем томкат, смотрим его логи, убеждаемся что он доступен по http://hostname.com:8080/
  • 7.запускаем апач, заходим на http://hostname.com. Должен открыться шоукейс. Если этого не произошло - смотрим логи апача и томката
  • 8.Заходим на http://hostname.com/mediawiki, убеждаемся что доступен наш ресурс по адресу hostname.com/mediawiki

WIN!

Настройка лог файла доступа к tomcat и его приложениям (файл localhost_access_log_current_data.txt)

Для более информативной настройки шаблона файла лога предлагается в настройках Tomcat в файле conf/server.xml поменять:

<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log." suffix=".txt"
               pattern="%h %l %u %t &quot;%r&quot; %s %b" />

на

<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log." suffix=".txt"
               pattern="%h %t &quot;%U&quot; &quot;%q&quot; %s %b %D" />

Данные настройки выводят в лог строки следующего шаблона:

[ip-адрес с которого пришел запрос] [Дата-время] "url-запроса к серверу" "параметры в url после символа ?" [HTTP status code of the response] [Колличество даных в байтах] 
[время в мс, потребовавшееся для выполнения запроса]

Тег valve с типом className="org.apache.catalina.valves.AccessLogValve" поддерживает следующие аттрибуты:

  1. className Java class name of the implementation to use. This MUST be set to org.apache.catalina.valves.AccessLogValve to use the default access log valve. To use a more optimized access log valve designed for production use, you MUST set this attribute to org.apache.catalina.valves.FastCommonAccessLogValve. In this case, only the common and combined patterns are supported.
  2. directory Absolute or relative pathname of a directory in which log files created by this valve will be placed. If a relative path is specified, it is interpreted as relative to $CATALINA_HOME. If no directory attribute is specified, the default value is "logs" (relative to $CATALINA_HOME).
  3. pattern A formatting layout identifying the various information fields from the request and response to be logged, or the word common or combined to select a standard format. See below for more information on configuring this attribute. Note that the optimized access does only support common and combined as the value for this attribute.
  4. prefix The prefix added to the start of each log file's name. If not specified, the default value is "access_log.". To specify no prefix, use a zero-length string.
  5. resolveHosts Set to true to convert the IP address of the remote host into the corresponding host name via a DNS lookup. Set to false to skip this lookup, and report the remote IP address instead.
  6. suffix The suffix added to the end of each log file's name. If not specified, the default value is "". To specify no suffix, use a zero-length string.
  7. rotatable Default true. Flag to determine if log rotation should occur. If set to false, then this file is never rotated and fileDateFormat is ignored. Use with caution!
  8. condition Turns on conditional logging. If set, requests will be logged only if ServletRequest.getAttribute() is null. For example, if this value is set to junk, then a particular request will only be logged if ServletRequest.getAttribute("junk") == null. The use of Filters is an easy way to set/unset the attribute in the ServletRequest on many different requests.
  9. fileDateFormat Allows a customized date format in the access log file name. The date format also decides how often the file is rotated. If you wish to rotate every hour, then set this value to: yyyy-MM-dd.HH

Шаблон (pattetn) вывода в лог задается с помощь следующих кодов шаблона:

  • %a - Remote IP address
  • %A - Local IP address
  • %b - Bytes sent, excluding HTTP headers, or '-' if zero
  • %B - Bytes sent, excluding HTTP headers
  • %h - Remote host name (or IP address if resolveHosts is false)
  • %H - Request protocol
  • %l - Remote logical username from identd (always returns '-')
  • %m - Request method (GET, POST, etc.)
  • %p - Local port on which this request was received
  • %q - Query string (prepended with a '?' if it exists)
  • %r - First line of the request (method and request URI)
  • %s - HTTP status code of the response
  • %S - User session ID
  • %t - Date and time, in Common Log Format
  • %u - Remote user that was authenticated (if any), else '-'
  • %U - Requested URL path
  • %v - Local server name
  • %D - Time taken to process the request, in millis
  • %T - Time taken to process the request, in seconds
  • %I - current request thread name (can compare later with stacktraces)

Настройка протокола https, используя SSL сертификат

Алгоритм настройки следующий:

  1. Получение сертификата и приведение его в нужный вид;
  2. Импорт сертификата в java-хранилище ключей (JKS);
  3. Настройка коннектора в server.xml для открытия порта защищенного соединения.
  4. Настройка автоматической переадресации в web.xml

Необходимое ПО для работы с сертификатами:

  • openSSL <сайт>
  • keytool (является компонентом jdk)

Самоподписанный сертификат

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

1. Для генерации самоподписанного сертификата необходимо выполнить следующую команду в консоли с помощью keytool:

>keytool -genkey -alias tomcat -keyalg RSA -keystore mykeystore -validity 999 -keysize 512

где:

  • tomcat - псевдоним
  • mykeystore - имя java-хранилища ключей

Затем в консоли необходимо ввести следующие данные (запросы идут по очереди):

  • Enter keystore password: mypassword
  • What is your first and last name? [Unknown]: first last
  • What is the name of your organizational unit? [Unknown]: unit
  • What is the name of your organization? [Unknown]: organization
  • What is the name of your City or Locality? [Unknown]: city
  • What is the name of your State or Province? [Unknown]: state
  • What is the two-letter country code for this unit? [Unknown]: ru
  • Is CN=firstname lastname, OU=organizationalunit, O=organization, L=city, ST=state, C=ru correct? [no]: yes
  • Enter key password for (RETURN if same as keystore password): <пусто>

2. Полученный файл хранилища ключей с именем mykeystore необходимо поместить в папку ../Apache Software Foundation/Tomcat (корень томката)

3. Добавить следующий элемент настройки коннектора порта 8443 в файл ../Tomcat/conf/server.xml

   <Connector port="8443" SSLEnabled="true" maxHttpHeaderSize="8192" 
        maxThreads="150" minSpareThreads="25" maxSpareThreads="200"
        enableLookups="false" disableUploadTimeout="true"         
        acceptCount="100" scheme="https" secure="true"
        clientAuth="false" sslProtocol="TLS"
        keystoreFile="mykeystore" keystorePass="mypassword" keystoreType="JKS"
        keyAlias="tomcat"/>

4. Перезапустить Tomcat. Теперь будет доступен порт https://localhost:8443

Генерация сертификата с помощью letsencrypt

На данный момент мы точно уверены, что при генерации сертификата для Tomcat-а на Windows сервере подходит версия letsencrypt-win-simple.V1.9.3, в более поздних версиях были ошибки.

Для генерации сертификата нужно обязательно настроить Tomcat на порт 80. Это необходимо для того, чтобы центр авторизации мог верифицировать принадлежность нам домена, на который выпускается сертификат. Обращаем ваше внимание, что letsencryp выпускает сертификаты только типа DV (Domain Verified), что означает необходимость подтверждения принадлежности домена лицу, выпускающему сертификат.

Для создания сертификата запустите командную строку от имени администратора и выполните команду

letsencrypt.exe --manualhost domain.com --webroot "*TOMCAT PATH*\webapps"

Выберите пункт "Create certificate manually" после чего следуйте инструкциям в окне командной строки. Когда программа спросит, какой метод верификации выбрать, укажите Self-hosted verification.

После завершения работы программы в C:\Users\Username\AppData\Roaming\letsencrypt-win-simple будут сгенерированы ваши сертификаты:

  • myurl.com-key.pem - это приватный ключ хранящийся на сервере, используется для шифровка/дешифровки данных, передаваемых по SSL
  • myurl.com-csr.pem - запрос на получение сертификата, который представляет собой текстовый файл, содержащий в закодированном виде информацию об администраторе домена и открытый ключ.
  • myurl.com-gen-csr.json - в json формате
  • myurl.com-gen-key.json - в json формате
  • myurl.com-crt.pem - собственно, сам сертификат, передаваемый с каждым запросом
  • myurl.com-crt.der - Другой формат представления сертификата
  • myurl.com-chain.pem - Chain , содержит и сертификат центра авторизации, и наш сертификат
  • myurl.com-all.pfx - Зашифрованный файл, содержащий в себе все
  • ca-CRYPTICODE-crt.pem - Сертификат на letsencrypt, (сертификат более крутого центра верификации, что lensencrypt не совсем плох)
  • ca-CRYPTICODE-crt.der - Зашифрованный
  • Registration, Signer - Возможно используются в процессе регистрации или верификации, в дальнейшем не используются


Сертификат, выпущенный официальным центром

Томкат может взаимодействовать только с хранилищами ключей в форматах JKS, PKCS11 и PKCS12. JKS - Java Key Store, формат, в котором создаются сертификаты с помощью утилиты keytool. Эта утилита включена в JDK. PKCS12 - стандартный интернетовский формат. Файлами этого формата можно управлять с помощью OpenSSl и Microsoft's Key-Manager (и др).

Для установки сертификата PEM-типа с расширением .crt или .cer необходим соответствующий файл private key (обычно с расширением .key), который был создан автоматически при генерации CSR запроса.

1. Убедиться, что сертификат и private key имеют одинаковую кодировку Base-64. Для этого нужно открыть их в текстовом редакторе, начало и конец файла должно выглядеть следующим образом:

-----BEGIN CERTIFICATE-----
-----END CERTIFICATE-----

-----BEGIN RSA PRIVATE KEY-----
-----END RSA PRIVATE KEY-----

Если сертификат имеет другую кодировку, необходимо перевести его в Base-64. Для этого открываем его двойным кликом, на вкладке <Состав> нажимаем <Копировать в файл>. В появившемся мастере экспорта сертификатов выбрать опцию <Файлы X.509 в кодировке Base-64> и выбрать место и имя сертификата для сохранения.

2. Преобразовать сертификат и его закрытый ключ в формат pkcs12 с помощью OpenSSL. Для этого в консоли необходимо выполнить следующую команду:

openssl pkcs12 -export -in cert.crt -inkey private.key -certfile cert.crt -name tomcat -out keystore.p12

Где:

  • cert.crt - сертификат в кодировке base-64, .crt или .cer
  • private.key - файл закрытого ключа к нашему сертификату
  • keystore - имя java-хранилища ключей
  • keystore.p12 - новый сертификат с закрытым ключом внутри.

Для повышения уровня надежности java-хранилища можно указать сертификат центра, выдавшего ваш сертификат. Для этого при выполнении команды выше следует указать дополнительные параметры:

openssl pkcs12 -export -in cert.crt -inkey private.key -certfile cert.crt -name tomcat -CAfile ca-CRYPTICODE-crt.pem -out keystore.p12 -caname root -chain

Либо, если идет генерация через letsencrypt, то chain файл уже сгенерирован:

openssl pkcs12 -export -in domain.com-chain.pem -inkey domain.com-key.pem -name tomcat -out keystore.p12

После выполнения команды необходимо ввести пароль к данному файлу.

Внимание. Если в процессе выполнения команды OpenSSL в консоли появилась следующая ошибка:

openssl error in reading openssl.conf file

Необходимо прописать путь к файлу openssl.conf вручную с помощью следующей команды:

set OPENSSL_CONF=C:/OpenSSL/bin/openssl.cfg

3. Добавить следующий элемент настройки коннектора порта 8443 в файл ../Tomcat/conf/server.xml. Для возможности переадресации необходимо старый Connector оставить.

<Connector
           protocol="org.apache.coyote.http11.Http11NioProtocol"
           port="8443" maxThreads="1000" acceptCount="3000"
           scheme="https" secure="true" SSLEnabled="true"
           keystoreFile="*Путь к файлу*/keystore.p12" keystorePass="mypassword"
           clientAuth="false" sslProtocol="TLS"
           keystoreType="PKCS12" keyAlias="tomcat"/>

Где:

  • keystore.jks - созданный .jsk файл в папке с томкатом
  • mypassword - пароль для keystore.jsk
  • tomcat - алиас

4. Перезапустить Tomcat. Теперь будет доступен порт https://localhost:8443

Настройка автоматической переадресации на https

Для настройки автоматической переадресации со старого порта 8080(http) на новый 8443(https) необходимо добавить следующую запись в файл web.xml внутри тега <web-app>:

<security-constraint>
<web-resource-collection>
<web-resource-name>Protected Context</web-resource-name>
 <url-pattern>/*</url-pattern>
</web-resource-collection>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>

При этом возможно введение переадресации как для всех проектов сразу (если добавить запись в web.xml, расположенный в корне томката ../Tomcat/conf/web.xml), так и отдельно для каждого приложения (если добавить запись в соответствующий проекту web.xml, расположенный в конкретном вебаппс ../Tomcat/webapps/<нужный проект>/WEB-INF/web.xml).

Для того, чтобы изменения вступили в силу, необходимо перезапустить Tomcat.

Теперь, при попытке входа в проект через http://localhost:8080 будет выполнена автоматическая переадресация на https://localhost:8443