PEM-Humboldt / biomodelos-scrum

Just for project management
0 stars 0 forks source link

POC: Implementar servidor con SSL en local para BioModelos #91

Closed danflop closed 2 years ago

danflop commented 2 years ago

El objetivo de esta tarea es implementar de forma local un certificado SSL en un servidor nginx que pueda utilizarse con BioModelos. El certificado puede ser auto-firmado y para ello se debe investigar el proceso para implementarlo.

El resultado esperado es una POC del servidor funcional con un certificado SSL en un equipo local.

Tener en cuenta la guía de la tarea #345 y las actividades listadas del resultado de la misma.

erikasv commented 2 years ago

Creé el ambiente con los siguientes pasos, teniendo en cuenta que mi ambiente de desarrollo ya está en contenedores docker (todos en la misma red):

  1. Seguí los pasos aquí listados para generar el certificado autofirmado.
  2. Creé un contenedor con nginx (docker run --name bm_nginx_dev -p 3500:443 -d nginx) y lo conecté a la misma red de los demás contenedores.
  3. Copié los archivos del certificado al contenedor nuevo de nginx.
  4. Seguí los pasos de la sección Configuring the Web Server to Support HTTPS.

    1. Concatené el .crt y el .csr como lo indica la subsección Intermediate and SSL Certificate Bundle.
    2. Además de la configuración descrita en la subsección Nginx, agregué otras configuraciones basandome en el nginx de biotablero, de tal forma que el archivo de configuración quedó así:

          upstream app {
            server bm_front_dev:3000;
          }
      
          server {
            listen       443 ssl;
            server_name  localhost;
            ssl_certificate /certificate_and_chain.pem;
            ssl_certificate_key /server.key;
            ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
            ssl_ciphers HIGH:!aNULL:!MD5;
      
            access_log  /var/log/nginx/host.access.log  main;
      
            location / {
              proxy_pass    http://app/;
              proxy_set_header    Host  $host;
              proxy_redirect     off;
              root   /usr/share/nginx/html;
              index  index.html index.htm;
            }
      
            error_page   500 502 503 504  /50x.html;
      
            location = /50x.html {
              root   /usr/share/nginx/html;
            }
          }

      No he forzado el ssl en la aplicación de Rails, pero además del warning del navegador porque usa un certificado autofirmado, lo poco que exploré carga bien. Dejaré el ajuste y revisión de las demás cosas a la tarea #346

image.png

erikasv commented 2 years ago

Como parte de la tarea 346 se modificaron algunas cosas en la configuración del nginx, aunque esto no nos corresponde en el ambiente de producción, es una guía para reproducir en ambiente local y para tener en cuenta si se requiere solicitar algo a tecnologías cuando se lleve a producción. La configuración final quedó así:

upstream bm_front {
  server bm_front_dev:3000;
}

server {
    listen 80;
    server_name  biomodelos_dev;
    return 301 https://biomodelos_dev$request_uri;
}

server {
    listen       443 default_server ssl;
    server_name  biomodelos_dev;
    ssl_certificate /certificate_and_chain.pem;
    ssl_certificate_key /server.key;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers HIGH:!aNULL:!MD5;

    client_max_body_size 50M;

    access_log  /var/log/nginx/host.access.log  main;

    location / {
        proxy_pass    http://bm_front/;
        proxy_set_header    Host  $host;
        proxy_set_header X-Forwarded-Proto https;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_redirect     off;
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

Lo más importante que se requiere del nginx institucional es que es se envíe el header X-Forwarded-Proto https;