Статьи

Защита вашего приложения Tomcat с помощью SSL и Spring Security

 Если вы видели мой последний блог, вы знаете, что я перечислил десять вещей, которые вы можете сделать с помощью Spring Security . Однако, прежде чем вы начнете использовать Spring Security по-настоящему, первое, что вам действительно нужно сделать, — убедиться, что ваше веб-приложение использует правильный транспортный протокол, который в данном случае — HTTPS — ведь нет смысла иметь безопасный веб-сайт. если вы собираетесь транслировать пароли своих пользователей по всему Интернету в виде простого текста. Для настройки SSL есть три основных шага …

Создание хранилища ключей

Первое, что вам нужно, — это закрытое хранилище ключей, содержащее действительный сертификат, и самый простой способ сгенерировать один из них — использовать утилиту keytool Java, расположенную в каталоге $ JAVA_HOME / bin.

keytool -genkey -alias MyKeyAlias -keyalg RSA -keystore /Users/Roger/tmp/roger.keystore

В приведенном выше примере

  • -alias — это уникальный идентификатор вашего ключа.
  • -keyalg — алгоритм, используемый для генерации ключа. Большинство примеров, которые вы найдете в Интернете, обычно ссылаются на «RSA», но вы также можете использовать «DSA» или «DES».
  • -keystore — необязательный аргумент, указывающий местоположение вашего файла хранилища ключей. Если этот аргумент отсутствует, то местоположением по умолчанию является каталог $ HOME.

RSA означает Ron Rivest (также создатель
алгоритма RC4 ), Adi Shamir и Leonard Adleman

DSA — алгоритм цифровой подписи,

DES — стандарт шифрования данных.


Для получения дополнительной информации о keytool и его аргументах
ознакомьтесь с
этой
статьей Informit Джона Сведе.

Когда вы запустите эту программу, вам зададут несколько вопросов:

Roger$ keytool -genkey -alias MyKeyAlias -keyalg RSA -keystore /Users/Roger/tmp/roger.keystore
Enter keystore password: 
Re-enter new password:
What is your first and last name?
  [Unknown]:  localhost
What is the name of your organizational unit?
  [Unknown]:  MyDepartmentName
What is the name of your organization?
  [Unknown]:  MyCompanyName
What is the name of your City or Locality?
  [Unknown]:  Stafford
What is the name of your State or Province?
  [Unknown]:  NA
What is the two-letter country code for this unit?
  [Unknown]:  UK
Is CN=localhost, OU=MyDepartmentName, O=MyCompanyName, L=Stafford, ST=UK, C=UK correct?
  [no]:  Y

Enter key password for 
     (RETURN if same as keystore password): 

Большинство полей говорят сами за себя; однако для значений первого и второго имени я обычно использую имя машины — в данном случае localhost.

Обновление конфигурации Tomcat

Второй шаг в защите вашего приложения — убедиться, что у вашего кота есть SSL-коннектор. Для этого вам нужно найти файл конфигурации tomcat server.xml, который обычно находится в каталоге ‘conf’. Как только вы освоите это, и если вы используете tomcat, вам нужно будет раскомментировать:

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

<Connector SSLEnabled="true" keystoreFile="/Users/Roger/tmp/roger.keystore" keystorePass="password" port="8443" scheme="https" secure="true" sslProtocol="TLS"/> 


Обратите внимание, что пароль «пароль» в виде простого текста, который не очень безопасен.
Есть способы обойти это, но это выходит за рамки этого блога.

Если вы используете Spring tcServer, то обнаружите, что у него уже есть SSL-коннектор, который настроен примерно так:

<Connector SSLEnabled="true" acceptCount="100" connectionTimeout="20000" executor="tomcatThreadPool" keyAlias="tcserver" keystoreFile="${catalina.base}/conf/tcserver.keystore" keystorePass="changeme" maxKeepAliveRequests="15" port="${bio-ssl.https.port}" protocol="org.apache.coyote.http11.Http11Protocol" redirectPort="${bio-ssl.https.port}" scheme="https" secure="true"/>

… В этом случае это просто вопрос редактирования различных полей, включая keyAlias, keystoreFile и keystorePass.

Настройка вашего приложения

Если вы сейчас запустите tomcat и запустите свое веб-приложение, вы обнаружите, что оно доступно через HTTPS. Например,
введите https: // localhost: 8443 / my-app , но также и
http: // localhost: 8080 / my-app. Это означает, что вам также нужно выполнить некоторые jiggery-pokery в своем приложении, чтобы убедиться, что оно работает. только отвечает на HTTPS, и есть два подхода, которые вы можете использовать.

Если вы не используете Spring Security, вы можете просто добавить следующее в ваш файл web.xml перед последним тегом веб-приложения:

Если вы используете Spring Security, то есть еще несколько шагов, чтобы все заработало. Часть общих настроек Spring Security заключается в добавлении следующего в ваш файл web.xml. Сначала вам нужно добавить контекстный файл приложения Spring Security в contextConfigLocation context-param:

<context-param>
          <param-name>contextConfigLocation</param-name>
          <param-value>/WEB-INF/spring/root-context.xml
           /WEB-INF/spring/appServlet/application-security.xml           
          </param-value>
     </context-param>

Во-вторых, вам нужно добавить фильтр Spring Security и сопоставление фильтров:

<filter>
    <filter-name>springSecurityFilterChain</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

Наконец, вам нужно создать или отредактировать файл application-security.xml, как показано в очень минималистичном примере ниже:

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/security"
  xmlns:beans="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
           http://www.springframework.org/schema/security
           http://www.springframework.org/schema/security/spring-security-3.1.xsd">

       <http auto-config='true' >
          <intercept-url pattern="/**" requires-channel="https" />    
       </http>

       <authentication-manager>
       </authentication-manager>

</beans:beans>

В приведенном выше примере элемент intercept-url был настроен на перехват всех URL-адресов и заставляет их использовать канал https.

Приведенные выше сведения о конфигурации могут создать впечатление, что проще использовать простое изменение конфигурации web.xml, но если вы уже используете Spring Security, то это только вопрос добавления атрибута require-channel в существующую конфигурацию.


Пример приложения под названием tomcat-ssl, демонстрирующий вышесказанное, доступно на git hub по адресу:
https://github.com/roghughe/captaindebug.