Marthym bio photo

Marthym

Fred, un Nième développeur qui partage n’importe quoi ...

Dans le cadre d’un projet, j’ai une configuration Spring Secure tel que :

...
http.requiresChannel()
    .antMatchers("/client/").requiresSecure()
    .antMatchers("/fr/client/").requiresSecure()
    .antMatchers("/es/client/").requiresSecure()
    .antMatchers("/en/client/").requiresSecure()
...

Ce qui provoque un redirect vers https si l’on tente d’accéder à l’une de ces URL en http.

Le problème est lorsque que je mets un reverse proxy NginX devant, c’est lui qui s’occupe du https, il redirige vers mes routes Spring en http. Spring ne permet de configurer qu’un seul port de serveur qui peut faire http/https. Mais tous mes certif ne sont pas configurés et j’ai pas forcément envie de faire du https entre NginX et Spring.

Du coup, pour que Spring détecte la connexion comme sécurisé et ne fasse pas une redirection infinie entre lui et le reverse proxy, il faut que la configuration NginX ressemble à ça :

server {
    listen       443 ssl;
    server_name   monsite.fr

    ssl on;
    ssl_certificate     /etc/ssl/monsite.fr.crt;
    ssl_certificate_key /etc/ssl/monsite.fr.key;
    ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers         HIGH:!aNULL:!MD5;

    location / {
        proxy_set_header Host $host;
        proxy_set_header X-Is-Secure true;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Port 443;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto https;
        proxy_pass http://localhost:9003/;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

L’important étant les headers X-Forwarded.