Nginx управляет SSL с помощью Tomcat 7

Какова правильная настройка в server.xml для управления протоколом nginx? Моя текущая конфигурация приводит к "циклу переадресации", если я не отмечу стандартное соединение tomcat "secure", которое не то, что я хочу. Мое приложение требует https для всех запросов и перенаправления на https, если используется http. Если я установил secure = "true", он больше не будет перенаправлен, но "цикл перенаправления" исчез. Что я делаю неправильно?

Мой текущий tomcat server.xml:

 <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               URIEncoding="UTF-8"
               redirectPort="8443" proxyPort="443"/>

Nginx conf:

  server {
        listen 80 default_server;
        server_name localhost, mydomain.com;

         location / {

        add_header 'Access-Control-Allow-Origin' '*';
         proxy_pass        http://localhost:8080/;
        proxy_redirect    off;
        proxy_set_header  Host               $host;
        proxy_set_header  X-Real-IP          $remote_addr;
        proxy_set_header  X-Forwarded-For    $proxy_add_x_forwarded_for;
        proxy_set_header  X-Forwarded-Proto  http;
        proxy_send_timeout 6000;
         }
        }
 server {
                 server_name localhost, mydomain.com;
                listen 443;

        ssl on;
        ssl_session_timeout 5m;
        ssl_protocols SSLv2 SSLv3 TLSv1;
        #make sure you already have this certificate pair!
        ssl_certificate /etc/nginx/cert/server.crt;
        ssl_certificate_key /etc/nginx/cert/server.key;
        ssl_session_cache shared:SSL:10m;
        error_page 497 https://$host:$server_port$request_uri;

        # Our endpoint for tomcat reverse-proxy, assuming your endpoint java-servlet knows
        # how to handle http://localhost/gadgets  requests
        location / {
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $http_host;
            proxy_set_header X-Forwarded-Proto https;
            proxy_set_header X-Url-Scheme $scheme;
            proxy_redirect off;
            proxy_connect_timeout      240;
            proxy_send_timeout         240;
            proxy_read_timeout         240;
            # note, there is not SSL here! plain HTTP is used
           proxy_pass http://localhost:8080/;
        }

     }

Ответ 1

Необходимо обрабатывать заголовки x-forwarded-и x-forwarded-proto в Tomcat. Добавьте на свой сервер server.xml следующее:

<Valve className="org.apache.catalina.valves.RemoteIpValve"
           remoteIpHeader="x-forwarded-for"
           remoteIpProxiesHeader="x-forwarded-by"
           protocolHeader="x-forwarded-proto"
    />

Ответ 2

Изменения, которые я сделал, чтобы Tomcat/ Spring установил правильные флаги безопасного файла cookie:

Убедитесь, что Tomcat имеет порт перенаправления SSL (443), работающий в server.xml:

<Service name="Catalina">
  ...
  <Connector executor="tomcatThreadPool"
    port="9090" protocol="HTTP/1.1"
    connectionTimeout="20000"
    redirectPort="8443" />
  ...
</Service>

Убедитесь, что ваш RemoteIpValve настроен внутри вашего хоста в server.xml:

<Service name="Catalina">
  ...
  <Engine name="Catalina" defaultHost="localhost">
    ...
    <Host name="localhost"  appBase="webapps"
        unpackWARs="true" deployOnStartup="true" autoDeploy="true">
      ...
      <!-- Mark HTTP as HTTPS forward from SSL termination at nginx proxy -->
      <Valve className="org.apache.catalina.valves.RemoteIpValve"
        remoteIpHeader="x-forwarded-for"
        remoteIpProxiesHeader="x-forwarded-by"
        protocolHeader="x-forwarded-proto"
        />
    </Host>
  </Engine>
</Service>

Убедитесь, что протокол пересылается из точки завершения в nginx.conf:

# Tomcat we're forwarding to
upstream tomcat_server {
  server 127.0.0.1:9090 fail_timeout=0;
}

# Main server proxy
server {
  listen 443 ssl;
  server_name  sample.com;

  # HTTPS setup
  ssl on;
  ssl_session_timeout 10m;
  ssl_session_cache shared:SSL:10m;

  #ssl cyphers
  ... 
  #ssl certs
  ... 

  location / {

    # Forward SSL so that Tomcat knows what to do
    proxy_set_header X-Forwarded-Host $host;
    proxy_set_header X-Forwarded-Server $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass http://tomcat_server;
    proxy_set_header X-Forwarded-Proto https;

    proxy_redirect off;
    proxy_connect_timeout      240;
    proxy_send_timeout         240;
    proxy_read_timeout         240;

    # Show error pages from S3 when down
    proxy_next_upstream error timeout http_502 http_503 http_504;
    error_page   502 503 504   https://s3.amazonaws.com/sample.com/maint;
}

Большая часть моего прокси /SSL nginx conf приведена выше для полноты. Надежда, которая помогает кому-то.