Laravel Linux Nginx Servidores

Certificado SSL Let’s Encrypt con NGINX, Ubuntu 14.04 y Laravel 5

Septiembre 6, 2016

[AdSense-A]

Hoy vamos aprender como instalar y configurar Let’s Encrypt en un VPS con NGINX y Ubuntu 14.04, primero que todo vamos una vez nos conectemos mediante ssh nos aseguramos de estar en la carpeta de usuario

$ cd

 

Una vez aquí vamos a descargar Certbot script, el cual nos ayudará a instalar todo lo necesario, de manera fácil vamos a ello:

$ wget https://dl.eff.org/certbot-aut

 

$ sudo chmod a+x certbot-auto

para continuar según la página oficial bastaría con ejecutar, lo cual no se los recomiendo al menos a mi no me funcionó de ésta manera

$ ./certbot-auto

 

Por lo que vamos a utilizar un plugin de certbot el cual se llama webroot para pasarle las rutas especificas de donde tenemos nuestro dominio, en nuestro caso usaremos el dominio midominio.com, recuerden reemplazar midominio.com por SU dominio y la ruta de su dominio en mi caso es /home/user/midominio.com/public , es importante recalcar que ésta ruta debe ser a la carpeta publica de tu dominio en el caso que estemos trabajando con Laravel 5 la carpeta public de ésta ruta corresponde a la carpeta public de nuestro proyecto Laravel 5, de otra manera nos retornará un error diciendonos que no tiene permisos por que no puede acceder, bueno para esto entonces ejecutamos con sudo el comando.

$ sudo ./certbot-auto certonly --webroot -w /home/user/midominio.com/public -d midominio.com -d www.midominio.com

 

Una vez lo ejecutamos nos pedirá un email, ingresamos cualquier email que nos pertenezca

 

En este caso estamos generado un certificado para el dominio sin y con www los dos en uno :), si todo va bien nos debería retornar algo como lo siguiente indicandonos la fecha de vencimiento:

IMPORTANT NOTES:
- If you lose your account credentials, you can recover through
   e-mails sent to [email protected]
- Congratulations! Your certificate and chain have been saved at
   <span class="highlight">/etc/letsencrypt/live/midominio.com/</span>fullchain.pem. Your
   cert will expire on <span class="highlight">2016-12-15</span>. To obtain a new version of the
   certificate in the future, simply run Let's Encrypt again.
- Your account credentials have been saved in your Let's Encrypt
   configuration directory at /etc/letsencrypt. You should make a
   secure backup of this folder now. This configuration directory will
   also contain certificates and private keys obtained by Let's
   Encrypt so making regular backups of this folder is ideal.
- If like Let's Encrypt, please consider supporting our work by:
 
   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

 

 

Importante: Si reciben un error Failed to connect to host for DVSNI challenge deben asegurarse de que el firewall de su VPS tenga abierto los puertos 80 y 443

Si todo fue bien ésto nos va a generar 4 archivos

cert.pem: Certificado de el dominio
    chain.pem: The Let’s Encrypt chain certificado
    fullchain.pem: cert.pem y chain.pem combinados
    privkey.pem: Nuestra llave de certificado privada

 

Estos archivos deberian estar creados en /etc/letsencrypt/archive, pero si intentamos acceder no podremos simplemente, lo que hace Let’s Encrypt es que aquí almacena los certificados y se guardan los nuevos a la hora de renovarlos, a su vez se generó un enlace simbólico de los certificados más recientes en /etc/letsencrypt/live/midominio.com

Vamos a confirmar que esos archivos realmente se hayan creado y por ende esten allí:

$ sudo ls -l /etc/letsencrypt/live/midominio.com

[AdSense-A]

el resultado sería lo siguiente:

$ [email protected]:~$ sudo ls -l /etc/letsencrypt/live/midominio.com
total 0
lrwxrwxrwx 1 root root 45 Sep  6 12:25 cert.pem -> ../../archive/midominio.com/cert1.pem
lrwxrwxrwx 1 root root 46 Sep  6 12:25 chain.pem -> ../../archive/midominio.com/chain1.pem
lrwxrwxrwx 1 root root 50 Sep  6 12:25 fullchain.pem -> ../../archive/midominio.com/fullchain1.pem
lrwxrwxrwx 1 root root 48 Sep  6 12:25 privkey.pem -> ../../archive/midominio.com/privkey1.pem

Vamos a incrementar la seguridad creando un Diffie-Hellman Group de 2048-bit

$ sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

Esto demorará unos dos minutos aproximadamente, tranquilo, se demora pero vale la pena

Una vez ya haya finalizado, vamos a poder editar la configuración nginx de nuesstro dominio para utilizar SSL, abriremos nuestro archivo de configuración de nuestro dominio en mi caso utilizare nano

$ sudo nano /etc/nginx/sites-avaliable/midominio.com

en caso de tener estas líneas:

listen 80 default_server;
listen [::]:80 default_server ipv6only=on;

las comentamos quedando:

    
#listen 80 default_server;
#listen [::]:80 default_server ipv6only=on;

dentro de nuestro bloque server donde indicamos nuestro root path vamos a agregar lo siguiente:

listen 443 ssl;
 
server_name midominio.com www.midominio.com;
 
ssl_certificate /etc/letsencrypt/live/midominio.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/midominio.com/privkey.pem;

Con esto hacemos que:

  • Escuche en el puerto 443
  • Indicamos el server_name apuntando a nuestro dominio sin y con www
  • Indicamos el path a nuestros certificados SSL creados anteriormente de Let’s Encrypt

Debajo de ésto agregamos tambien lo siguiente, para utilizar sólo los protocolos SSL y sistemas de cifrados más seguros, además de Diffie-Hellman Group generado anteriormente:

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_stapling on;
ssl_stapling_verify on;
add_header Strict-Transport-Security max-age=15768000;

 

Para terminar la edición de nuestro archivo de configuración fuera de nuestro bloque server agregaremos otro bloque server tal como se muestra  a continuación:

server {
    listen 80;
    server_name midominio.com www.midominio.com;
    return 301 https://$host$request_uri;
}

 

[AdSense-A]

Con esto estamos redirigiendo todo el tráfico de el puerto 80 de nuestro dominio con y sin www hacia la ruta correspondiente con https, osea al puerto 443, el archivo de configuración completo deberia quedar de la siguiente forma:

server {
    listen       80;
    server_name midominio.com www.midominio.com;
    return 301 https://www.midominio.com$request_uri;
}
server {
    #listen 80;
    #listen [::]:80 default_server ipv6only=on;
 
    listen 443 ssl;
 
    server_name midominio.com www.midominio.com;
 
    ##  redirect https non-www to https www
    if ($host = 'midominio.com' ) {
        return 301 https://www.midominio.com$request_uri;
    }
 
    ssl_certificate /etc/letsencrypt/live/midominio.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/midominio.com/privkey.pem;
 
 
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    ssl_dhparam /etc/ssl/certs/dhparam website here.pem;
    ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA$
    ssl_session_timeout 1d;
    ssl_session_cache shared:SSL:50m;
    ssl_stapling on;
    ssl_stapling_verify on;
    add_header Strict-Transport-Security max-age=15768000;
 
 
 
 
    root /home/user/midominio.com/public;
    index index.php index.html index.htm;
 
    
 
    location / {
        try_files $uri $uri/ /index.php?$query_string;
 
    }
 
    location ~ \.php$ {
        try_files $uri /index.php =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
 
}

con CTRL+X guardamos y reiniciamos NGINX

$ sudo service nginx reload

 

Ahora al acceder a nuestra web utilizando https y debería todo funcionar perfectamente, recuerden forzar el uso de https en las rutas creadas con url() o URL::to() dentro de Laravel, para ello pueden seguir este fácil y simple artículo.

Les recomiendo utilizar la web Qualys SSL Labs Report para verificar el puntaje que obtiene la configuración que acabamso de realizar en mi caso es un A

https://www.ssllabs.com/ssltest/analyze.html?d=midominio.com

 

Espero que a más de alguno le sirva :D.

Comentarios

comentarios

Related Articles

Read previous post:
nginx: [warn] conflicting server name “midominio.com” on 0.0.0.0:80

[AdSense-A] Hola a todos!, estando configurando un servidor con NGINX y colocar un bloque dentro de el archivo de configuración...

Close