Как настроить SSL в моем приложении Spring Boot, которое использует OAuth2 в AWS ElasticBeanstalk и Nginx? - PullRequest
0 голосов
/ 13 ноября 2018

Я пытаюсь заставить SSL использовать справочную документацию

https://docs.spring.io/spring-boot/docs/current/reference/html/howto-security.html#howto-enable-https

Однако у меня уже есть

@Configuration
class WebSecurityConfiguration  {

Когда я добавляю extends WebSecurityConfigurerAdapter, а не даже protected void configure(HttpSecurity http), тогда запросы на страницу не-Oauth2 /home/ перенаправляются на /login без причины. Работает с настройками свойств. Просто расширение класса extends WebSecurityConfigurerAdapter разрывает приложение. Есть и другие не связанные маршруты, защищенные OAuth2. Я видел это недетерминированное случайное поведение раньше при настройке Oauth2.

Это схема класса WebSecurityConfiguration.

@Configuration
class WebSecurityConfiguration {

    @Autowired
    UserMapper userMapper;

    @Bean
    PasswordEncoder passwordEncoder() {

    @Bean
    protected UserDetailsService userDetailsService() {

И это все.

Я попытался добавить конфигурацию Nginx для перенаправления в SSL, в этом ответе https://stackoverflow.com/a/53310987/148844,, но это не сработало. Он перенаправляет на SSL, но я получаю 404 ошибки для всех путей

HTTP-статус 404 - / home
Тип Отчет о состоянии
сообщение / home
описание Запрашиваемый ресурс недоступен.
Apache Tomcat / 8.0.47

tomcat 404

Итак, он форсирует SSL и получает доступ к Tomcat, но приложение Spring Boot полностью запутано. Это как если бы файл WAR в ZIP никогда не развертывался.

Ссылка: https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/java-tomcat-proxy.html#java-tomcat-proxy-nginx

Ответы [ 2 ]

0 голосов
/ 23 ноября 2018

Я думаю, вам не нужно заботиться о включении стороны SSL на tomcat или application, и это не требуется, просто включите ssl до nginx.

Вы должны просто прекратить SSL на nginx и передать proxy/reverse-proxy на tomcat.

Вот некоторые ссылки, подтверждающие мою точку зрения. https://docs.nginx.com/nginx/admin-guide/security-controls/terminating-ssl-http/ https://www.digitalocean.com/community/tutorials/how-to-set-up-nginx-load-balancing-with-ssl-termination

В вашем случае вам необходимо выполнить следующие шаги.

1) Создайте файл 00_application.conf и поместите его в папку .ebextensions / nginx / conf.d /asticbeanstalk /.

2) 00_application.conf файл должен иметь следующее содержимое.

server {
    listen          443 ssl;
    server_name     www.example.com;
    ssl_certificate www.example.com.crt;
    #...
    location /{
//your tomcat port, I'm here assuming the your beanstalkserver tomcat is listing to 8080.
proxy_pass http://127.0.0.1:8080;
}
}

3) Прекратить перечисление на порт 80 по умолчанию и перенаправление на 443, т. Е. Если у вас http://foo.bar/ в качестве домена, вы перенаправите его https://foo.bar/, откройте файл nginx.conf, расположенный в .ebextensions/nginx/nginx.conf. Также обязательно напишите следующую строку, include conf.d/elasticbeanstalk/*.conf;

server {
listen 80;

server_name foo.bar;
return 301 https://foo.bar$request_uri;
}

Я думаю, что O-Auth, ни одно из приложений загрузки Auth, Spring boot v / s non springs здесь не так важно.

Обязательно соблюдайте примечание, написанное в документации AWS и разделе Расширение конфигурации nginx по умолчанию . Специально прочитайте записку, в которой говорится о Я надеюсь, что это отвечает на ваш вопрос. Я не проверял все вышеперечисленное на beanstalk, но остальные тестируются на EC2, tomcat с прокси nginx. Попробуйте это и опубликуйте конкретную проблему, которая может возникнуть в разделе комментариев.

0 голосов
/ 15 ноября 2018

Я отказался от использования Spring Boot для этого, так как он настолько нестабилен и прибег к опции конфигурации Nginx.Это сработало, хотя кажется слишком многословным для простого создания ZIP.В Elastic Beanstalk возникла дополнительная проблема:

AWS Elastic Beanstalk Tomcat работает с .war, но не с .zip

При развертывании ZIP он не будетразвернуть войну!Поэтому мне пришлось создать обходной путь для создания двух WAR-файлов в ZIP.(Только один, даже названный ROOT.war, не будет работать.)

Я не смог найти способ создать пустой файл с помощью Maven, поэтому я создал пустой файл empty.war в корневом каталоге проекта ион встроен в ZIP, чтобы заставить Elastic Beanstalk правильно работать и развертывать приложение.Какой беспорядок!Oy vey!

pom.xml
        <plugin> <!-- To add .ebextensions/ Nginx config for ElasticBeanstalk -->
          <artifactId>maven-assembly-plugin</artifactId>
          <configuration>
            <descriptors>
              <descriptor>assembly.xml</descriptor>
            </descriptors>
          </configuration>
          <executions>
            <execution>
              <id>make-assembly</id>
              <phase>package</phase>
              <goals>
                <goal>single</goal>
              </goals>
            </execution>
          </executions>
        </plugin>           
assembly.xml
<assembly 
  xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0" 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
  <id>bin</id>
  <baseDirectory>/</baseDirectory>
  <formats>
    <format>zip</format>
  </formats>
  <files>
    <file>
      <source>empty.war</source>
      <outputDirectory/>
    </file>
    <file>
      <source>${project.build.directory}/AppName-0.0.3-SNAPSHOT.war</source>
      <outputDirectory/>
      <destName>ROOT.war</destName>
    </file>
  </files>

  <fileSets>
    <fileSet>
      <directory>${project.basedir}</directory>
      <outputDirectory>/.ebextensions/nginx/conf.d/elasticbeanstalk/</outputDirectory>
      <includes>
        <include>force-https.conf</include>
      </includes>
    </fileSet>
  </fileSets>
</assembly>

А файл конфигурации находится просто в корне проекта.Я не знал, куда еще его положить - это не исходный код.

force-ssl.conf
if ($http_x_forwarded_proto = 'http') {
    return 301 https://$host$request_uri;
}

http://maven.apache.org/plugins/maven-assembly-plugin/assembly.html

...