У меня есть веб-приложение Spring MVC (v4.3.1), работающее на сервере Tomcat (v8.5), на котором работает сервер приложений Apache (v2.4), используемый в качестве обратного прокси-сервера.
У меня установлен сертификат SSL на Apache, чтобы он обрабатывал все защищенные (: 443) и незащищенные (: 80) входящие запросы и перенаправлял их на экземпляр Tomcat.
Я хочуобрабатывать все коммуникации как защищенные (SSL) с внешним миром.Но внутри Apache и Tomcat нет необходимости общаться через безопасный порт.Вот почему Apache перенаправляет все HTTP запросы на HTTPS
Я также использую Spring Security (v4) для обработки всех действий по авторизации / аутентификации пользователей, поэтому я даже зарегистрировался/ Логин / Выход из системы и т. Д.
Моя текущая архитектура сервера показана ниже:
После предоставления сводки проблема заключается в,
Всякий раз, когда я пытаюсь получить доступ к своей странице входа , я получаю ERR_TOO_MANY_REDIRECTS ошибку от Chrome.
Кроме того , когда я получаю доступTomcat Manager (http://myapp.net:8080/manager/html) и нажмите на URL моего приложения (/MyApp-1.0.0), затем ** я могу успешно просмотреть ** мою страницу входа без https. (После нажатия на ссылку приложения, развернутого на tomcat, он открываетсястраница: http://myapp.net:8080/MyApp-1.0.0/login) Я считаю, что это показывает, что нет проблем, когда мое веб-приложение работает на экземпляре tomcat. Они хорошо работают вместе. Он подозревает, что моя проблема начинается с Apache с SSL.
Конфигурация Apache для виртуальных компьютеровsts:
Listen 80
Listen 443
<VirtualHost *:80>
ServerAdmin emrecaglar@gmail.com
ServerName myapp.net
ServerAlias www.myapp.net
Redirect / https://www.myapp.net/
</VirtualHost>
<VirtualHost *:443>
ServerName myapp.net
ServerAlias www.myapp.net
ProxyPreserveHost On
ProxyPass / http://127.0.0.1:8080/MyApp-1.0.0/
ProxyPassReverse / http://127.0.0.1:8080/MyApp-1.0.0/
SSLEngine on
SSLCertificateFile /root/WWW.myapp.NET.crt
SSLCertificateKeyFile /root/www.myapp.net.key
SSLCertificateChainFile /root/dv_chain.txt
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
Я не хочу использовать правила перезаписи, если это не критично.Я хочу работать с Redirect.
Tomcat server.xml конфигурация:
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" />
Не определен соединитель для : 8443 , как яне хочу, чтобы Tomcat работал на безопасном порту.Tomcat будет связываться только с сервером Apache.
Конфигурация Spring Security:
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/static/**").permitAll()
.antMatchers("/register*").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.failureUrl("/login?error=true")
.defaultSuccessUrl("/view/home")
.permitAll()
.and()
.logout().logoutUrl("/logout").logoutSuccessUrl("/login?
logout").invalidateHttpSession(true).deleteCookies("auth_code",
"JSESSIONID").permitAll();
}
}
Я также прочитал некоторые сообщения о allowAll (), и anonymous () отличается, так что allowAll () может даже инициировать цикл перенаправления, поэтому для страницы входа она должна быть анонимной (), однако я не смог ее проверить.Я считаю, что это также нуждается в дополнительной роли с точки зрения безопасности весны.
Контроллеры My Spring:
@RequestMapping(value = "/", method = RequestMethod.GET)
public String homePage(Principal principal) {
/**
* Initialize session user if not initialized
*/
return "redirect:/view/home";
}
другое:
@Controller
@RequestMapping(value = "/view")
public class ViewController
{
@RequestMapping(value = "/home")
public String getHomePage(Model model, Principal principal)
{
//some logic
return "home";
}
}
Web MVC config для входа в систему:
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/login").setViewName("login");
}
У меня есть связанные преобразователи представлений и представлений (home.jsp, login.jsp)
Выводы отладки консоли разработчика Chrome для перенаправлений
General
Request URL: http://www.myapp.net/MyApp-1.0.0/login
Request Method: GET
Status Code: 302 Found
Remote Address: 207.154.208.158:80
Referrer Policy: no-referrer-when-downgrade
Response Header
HTTP/1.1 302 Found
Date: Sat, 17 Nov 2018 08:40:04 GMT
Server: Apache/2.4.18 (Ubuntu)
Location: https://www.myapp.net/MyApp-1.0.0/login
Content-Length: 314
Keep-Alive: timeout=5, max=92
Connection: Keep-Alive
Request Header
Content-Type: text/html; charset=iso-8859-1
GET /MyApp-1.0.0/login HTTP/1.1
Host: www.myapp.net
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.9
Cookie: JSESSIONID=8A4E001A841DBC4D55509605FF3E7E23
General
Request URL: https://www.myapp.net/MyApp-1.0.0/login
Request Method: GET
Status Code: 302
Remote Address: 207.154.208.158:443
Referrer Policy: no-referrer-when-downgrade
Response Header
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Connection: Keep-Alive
Content-Length: 0
Date: Sat, 17 Nov 2018 08:40:04 GMT
Expires: 0
Keep-Alive: timeout=5, max=92
Location: http://www.myapp.net/MyApp-1.0.0/login
Pragma: no-cache
Server: Apache/2.4.18 (Ubuntu)
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
X-XSS-Protection: 1; mode=block
Request Header
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9
Cache-Control: no-cache
Connection: keep-alive
Cookie: JSESSIONID=8A4E001A841DBC4D55509605FF3E7E23
Host: www.myapp.net
Pragma: no-cache
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36
Повторный цикл запросов между этими двумя запросами от HTTPS к HTTP и HTPPS снова
Apache access.log
67.171.8.29 - - [17/Nov/2018:08:41:59 +0000] "GET /MyApp-1.0.0/login HTTP/1.1" 302 429 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36"
Apache error.log
[Sat Nov 17 08:37:59.376633 2018] [mpm_event:notice] [pid 20673:tid 140534533293952] AH00489: Apache/2.4.18 (Ubuntu) mod_jk/1.2.41 OpenSSL/1.0.2g configured -- resuming normal operations
[Sat Nov 17 08:37:59.376707 2018] [core:notice] [pid 20673:tid 140534533293952] AH00094: Command line: '/usr/sbin/apache2'
Как видите, у меня нет никакого кода / конфигурации, связанного с SSL, для моего приложения Spring mvs и Tomcat.Им не нужно знать об этом, так как я хочу, чтобы apache отвечал только за SSL и обработку запросов https и перенаправления в Tomcat.
Что мне здесь не хватает, так что я вызываю петлю перенаправления?
Спасибо