1. Обзор
В этом руководстве показано как использовать HTTPS для защиты страницы входа в систему вашего приложения с помощью функции безопасности канала Spring.
Использование HTTPS для аутентификации имеет решающее значение для защиты целостности конфиденциальных данных при транспортировке.
Эта статья основана на учебнике по входу в систему Spring Security, добавив дополнительный уровень безопасности. Мы выделяем шаги, необходимые для защиты данных аутентификации, обслуживая страницу входа в систему через закодированный канал HTTPS.
2. Начальная Настройка Без Защиты Канала
Давайте начнем с конфигурации безопасности, описанной в вышеупомянутой статье.
Веб-приложение позволяет пользователям получать доступ к:
- /anonymous.html без аутентификации,
- /login.html , и
- другие страницы ( /homepage.html ) после успешного входа в систему.
Доступ контролируется следующей конфигурацией:
@Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/anonymous*") .anonymous(); http.authorizeRequests() .antMatchers("/login*") .permitAll(); http.authorizeRequests() .anyRequest() .authenticated();
Или через XML:
На данный момент страница входа доступна по адресу:
http://localhost:8080/spring-security-login/login.html
Пользователи могут аутентифицировать себя через HTTP, однако это небезопасно, так как пароли будут отправляться в виде обычного текста.
3. Конфигурация сервера HTTPS
Для доставки страницы входа только по протоколу HTTPS – ваш веб-сервер должен иметь возможность обслуживать страницы HTTPS . Для этого требуется, чтобы была включена поддержка SSL/TLS .
Обратите внимание, что вы можете либо использовать действительный сертификат, либо для целей тестирования создать свой собственный.
Допустим, мы используем Tomcat и запускаем наш собственный сертификат. Сначала нам нужно будет создать хранилище ключей с самозаверяющим сертификатом.
Создание хранилища ключей можно выполнить, выполнив следующую команду в терминале:
keytool -genkey -alias tomcat -keyalg RSA -storepass changeit -keypass changeit -dname 'CN=tomcat'
Это создаст закрытый ключ a и самозаверяющий сертификат в хранилище ключей по умолчанию для вашего профиля пользователя в вашей домашней папке.
Следующим шагом является редактирование conf/server.xml чтобы это выглядело так:
Второй тег SSL/TLS обычно закомментирован в файле конфигурации, поэтому комментирование и добавление информации о хранилище ключей-это все, что нужно. Дополнительная информация доступна в соответствующей документации |/Tomcat .
При наличии конфигурации HTTPS страница входа в систему теперь также может обслуживаться по следующему URL-адресу:
https://localhost:8443/spring-security-login/login.html
Веб-серверы, отличные от Tomcat, потребовали бы другой, но, вероятно, аналогичной конфигурации.
4. Настройка Безопасности Канала
На данный момент мы можем обслуживать страницу входа как по протоколу HTTP, так и по протоколу HTTPS. В этом разделе объясняется, как разрешить использование HTTPS.
Чтобы потребовать HTTPS для страницы входа в систему измените конфигурацию безопасности, добавив следующее:
http.requiresChannel() .antMatchers("/login*").requiresSecure();
Или добавьте атрибут requires-channel=”https” в свою XML-конфигурацию:
После этого пользователи могли входить в систему только по протоколу HTTPS. Все относительные ссылки, например, перенаправление на /homepage.html унаследует протокол исходного запроса и будет обслуживаться по протоколу HTTPS.
При смешивании запросов HTTP и HTTPS в одном веб-приложении необходимо учитывать дополнительные аспекты, требующие дополнительной настройки.
5. Смешивание HTTP и HTTPS
С точки зрения безопасности, обслуживание всего через HTTPS-это хорошая практика и твердая цель.
Однако, если использование исключительно HTTPS не является опцией, мы можем настроить Spring на использование HTTP, добавив в конфигурацию следующее:
http.requiresChannel() .anyRequest().requiresInsecure();
Или добавьте requires-channel=”http” атрибуты в XML:
Это предписывает Spring использовать HTTP для всех запросов, которые явно не настроены на использование HTTPS, но в то же время нарушает исходный механизм входа в систему. В следующих разделах объясняется основная причина.
5.1. Пользовательский URL-Адрес Для Обработки Входа По Протоколу HTTPS
Конфигурация безопасности в исходном руководстве по безопасности содержит следующее:
Без принуждения /perform_login использовать HTTPS перенаправление произойдет на его HTTP-вариант, потеряв регистрационную информацию , отправленную с исходным запросом.
Чтобы преодолеть это, нам нужно настроить Spring на использование HTTPS для URL-адреса обработки:
http.requiresChannel() .antMatchers("/login*", "/perform_login");
Обратите внимание на дополнительный аргумент /perform_login , переданный методу antMatchers .
Эквивалент в конфигурации XML требует добавления нового элемента < intercept-url> в конфигурацию:
Если ваше собственное приложение использует по умолчанию login-processing-url (который является /login ), вам не нужно настраивать это явно, так как шаблон /login* уже охватывает это.
При наличии конфигурации пользователи могут входить в систему, но не получать доступ к аутентифицированным страницам, например /homepage.html по протоколу HTTP, из-за функции защиты от фиксации сеанса Spring//.
5.2. Отключение сеанса-фиксация-защита
Фиксация сеанса – это проблема, которой нельзя избежать при переключении между HTTP и HTTPS.
По умолчанию Spring создает новый session-id после успешного входа в систему. Когда пользователь загружает страницу входа по протоколу HTTPS, файл cookie session-id пользователя будет помечен как безопасный. После входа в систему контекст переключится на HTTP, и файл cookie будет потерян, так как HTTP небезопасен.
Чтобы избежать этого s etting session-fixation-protection |/to none требуется .
http.sessionManagement() .sessionFixation() .none();
Или через XML:
Отключение защиты от фиксации сеанса может иметь последствия для безопасности , поэтому вам необходимо взвесить все ” за ” и “против”, если вы обеспокоены атаками на основе фиксации сеанса.
6. Тест
После применения всех этих изменений конфигурации доступ к /anonymous.html без входа в систему (используя либо http:// , либо https://) перенаправит вас на страницу через HTTP.
Открытие других страниц напрямую, как /homepage.html должен перенаправить вас на страницу входа в систему по протоколу HTTPS, и после входа в систему вы будете перенаправлены обратно на /homepage.html использование HTTP.
7. Заключение
В этом уроке мы рассмотрели, как настроить веб-приложение Spring, которое взаимодействует через HTTP, за исключением механизма входа в систему. Однако новые современные веб-приложения почти всегда должны использовать HTTPS исключительно в качестве своего протокола связи. Снижение уровня безопасности или отключение функций безопасности (например, фиксация сеанса-защита ) никогда не является хорошей идеей.
Этот учебник основан на кодовой базе , доступной на GitHub . Конфигурацию безопасности канала можно включить, указав https в качестве активного профиля Spring .