meta data de esta página
  •  

Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

Ambos lados, revisión anteriorRevisión previa
Próxima revisión
Revisión previa
aplicaciones:nginx:certificados [282021/07/ 11:22] – [Nginx con Certificados] lcaplicaciones:nginx:certificados [182023/01/ 13:36] (actual) – editor externo 127.0.0.1
Línea 1: Línea 1:
 +===== Nginx con Certificados =====
  
 +=== Paso 1 ===
 +Creamos un contenedor con ubuntu 
 +
 +<sxh>docker run -it ubuntu:latest</sxh>
 +=== Paso 2 ===
 +Nos conecta a la terminal del contenedor y ejecutamos 
 +  - Actualizamos el contenedor de ubuntu <sxh>apt-get update</sxh>
 +  - Intalamos los paquetes que vamos a necesitar <sxh>apt-get install -y certbot nginx  nano</sxh>
 +
 +=== Paso 3 ===
 +Pedimos un certificado a "Let's Encrypt"
 +<note warning>Previamente tenemos que hacer que el nombre del dominio (DNS) apunte a la ip del servidor</note>
 +<sxh>certbot certonly --standalone -d midominio.es</sxh>
 +
 +También podemos automatizar las peticiones de certificados sin que nos pida nada.
 +
 +<sxh >
 +certbot certonly \
 +    -d midominio.es \
 +    --noninteractive \
 +    --standalone \
 +    --agree-tos \
 +    --register-unsafely-without-email
 +</sxh>
 +<note>Si usamos la opción **--standalone**  previamente hay que asegurarse de que el servicio de nginx está parado ya que este método levanta un servidor web temporal y si ya tenemos nginx ejecutandose no va a funcionar.
 +
 +Para parar el servicio de ngnix <sxh>service nginx stop</sxh></note>
 +
 +=== Paso 4 ===
 +Si tenemos el servidor nginx arrancado el propio certbot nos lo puede configurar con el comando <sxh>certbot --nginx</sxh> . Si prefieres hacerlo manualmente debes de editar el fichero **etc/nginx/conf.d/default.conf** y añadir/crear lo siguiente
 +<sxh bash>
 +# Redirecciona el puerto 80 a https
 +server {
 +        listen 80 default_server;
 +        client_max_body_size 500M;
 +        return 301 https://midominio.es$request_uri;
 +        }
 +# Le indicamos donde están los certificados
 +server {
 +        ssl_stapling off;
 +        ssl_stapling_verify off;
 +        listen 443 ssl;
 +        client_max_body_size 1500M;
 +        server_name midominio.es;
 +        ssl_certificate     /etc/letsencrypt/live/registry.midominio.es/fullchain.pem;
 +        ssl_certificate_key /etc/letsencrypt/live/registry.midominio.es/privkey.pem;
 +        ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
 +        ssl_ciphers         HIGH:!aNULL:!MD5;
 +  </sxh>
 +  
 + Aparte de lo anterior sería recomendable añadir las siguientes opciones de seguridad al fichero de configuración de nginx
 +<sxh bash>
 +  # Deshabilitar las cabeceras inválidas y la versión de nginx
 +ignore_invalid_headers      on;
 +server_tokens               off;
 +
 +#Evitar ataques de buffer overflow
 +client_body_buffer_size     100K;
 +client_header_buffer_size   1k;
 +client_max_body_size        100k;
 +large_client_header_buffers 2 1k;
 +
 +#Controlar Time-outs
 +client_body_timeout         15;
 +client_header_timeout       15;
 +send_timeout                15;
 +keepalive_timeout           5 5;
 +
 +#OCSP Stapling
 +ssl_stapling                on;
 +ssl_stapling_verify         on;
 +resolver                    1.1.1.1 208.67.222.222 208.67.220.220 valid=60s;
 +resolver_timeout            2s;
 +
 +</sxh>
 +==== Renovación del certificado  ====
 +=== Manualmente ===
 +Para renovar el certificado manualmente
 +<sxh>certbot renew</sxh>
 +=== Automáticamente ===
 +Con un script en cron que ejecute el comando diáramente. Por ejemplo este que se ejecuta todos los días a las 6 de la mañana y a las 9 de la noche
 +<sxh>0 6,21 * * * /usr/bin/certbot renew --quiet --post-hook "/bin/systemctl restart nginx.service"</sxh>
 +
 +Si las renovaciones no funcionan debemos hacer lo siguiente (https://www.jesusamieiro.com/instalar-un-servidor-web-lemp-iv-certificado-ssltls-de-lets-encrypt/)
 +
 +Editar el archivo /etc/nginx/sites-available/example_com, añadiendo:
 +<sxh bash>
 +server {
 +    listen 80;
 +    listen [::]:80;
 +    root /var/www/example_com/wordpress; #cambiar por tu ruta 
 +    index index.php index.html index.htm;
 +    server_name midominio.es www.midominio.es;
 +    
 +#permitir la respuesta HTTP a todo lo que se encuentre en el directorio “.well-known/acme-challenge/”, usado por Let’s Encrypt para crear y renovar los #certificados, ya que para verificar que en nuestro servidor está configurado ese dominio y las DNS apuntan a ese servidor, lo que hace Let’s Encrypt es #generar un archivo en el directorio “.well-known/acme-challenge/” (referenciado respecto a la raíz del directorio donde está instalado el sitio web, #indicado en el archivo de configuración de nginx por la variable “root”) y tratar de acceder externamente navegando a ese archivo.
 +    location ~ /\.well-known/acme-challenge/ {
 +        allow all;
 +    }
 +#Todas las peticiones que se soliciten en esa dirección no serán redireccionadas a HTTPS.
 +    location / {
 +        return 301 https://$host$request_uri;
 +    }
 +}
 +</sxh>
 +===== Referencias =====
 +  * https://www.albertcoronado.com/2020/01/22/configurar-un-contenedor-con-nginx-como-proxy-ssl-con-certificado-lets-encrypt/
 +  * https://www.albertcoronado.com/2020/05/05/contratar-un-certificado-ssl-gratis-con-lets-encrypt-y-configurar-nginx/
 +  * https://blog.ichasco.com/nginx-optimizar-y-securizar-un-despliegue-de-wordpress/