Generar Clave privada y Request

sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/nginx-selfsigned.key -out /etc/ssl/certs/nginx-selfsigned.crt

Completar los datos solicitados

Output
Country Name (2 letter code) [AU]:AR
State or Province Name (full name) [Some-State]:Buenos Aires
Locality Name (eg, city) []:Jose Leon Suarez
Organization Name (eg, company) [Internet Widgits Pty Ltd]: Dont Panic Inc. 
Organizational Unit Name (eg, section) []:Ministry of Water Slides
Common Name (e.g. server FQDN or YOUR name) []:server_IP_address
Email Address []:admin@your_domain.com

❗️ El dato mas importante a completar es Common Name (e.g. server FQDN or YOUR name) []:server_IP_address, si el servidor responde sin necesidad de dominio (algo no recomendado, siempre se debe verificar el dominio que se solicita) puede poner la IP EJ:10.0.0.2 directamente, o bien debe ingresar el dominio tanto sea real EJ: dontpanic.com como un dominio o host interno con resolucion de nombres realizando Split Horizont EJ: serverhost-01, serverhost-01.dontlocal

Utilizar el Certificado en un Virtual Host


server {
    listen 80;
    listen [::]:80;

    server_name your_domain.com www.your_domain.com;

    return 302 https://$server_name$request_uri;
}
server {
    listen 443 ssl;
    listen [::]:443 ssl;
    include snippets/self-signed.conf;
    include snippets/ssl-params.conf;

root /var/www/your_domain/html;
        index index.html index.htm index.nginx-debian.html;
  
  server_name your_domain.com www.your_domain.com;

  location / {
                try_files $uri $uri/ =404;
        }
}

Mejores practicas

Se puede mejorar la postura de seguridad restringiendo los cifrados aceptados
Listado actualizado por Mozila de https://wiki.mozilla.org/Security/Server_Side_TLS

Reforzar el certificado dhparam

El protocolo Diffie-Hellman por defecto utiliza parámetros de 1024 bits. Generamos uno nuevo de 4096 bits

sudo openssl dhparam -out /etc/nginx/dhparam.pem 4096
❗️ Atencion, este proceso puede tardar mucho tiempo en generar la llave, a tomar cafe ☕️ y esperar 💤

Archivo /etc/nginx/snippets/self-signed.conf

ssl_certificate /etc/ssl/certs/nginx-selfsigned.crt;
ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key;

Archivo /etc/nginx/snippets/ssl-params.conf

ssl_protocols TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_dhparam /etc/nginx/dhparam.pem; 
ssl_ciphers EECDH+AESGCM:EDH+AESGCM;
ssl_ecdh_curve secp384r1;
ssl_session_timeout  10m;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
# Disable strict transport security for now. You can uncomment the following
# line if you understand the implications.
#add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";