Si en tu aplicación web resulta que manejas información sensible de los usuarios este post es para ti.

Primero hay que todas las credenciales de inicio de sesión pueden ser robadas por un atacante intermedio por ejemplo usando una wifi pineapple o una infinidad de ataques en redes abiertas y para eso no nos puede ayudar ni la autenticación de dos factores. Por lo tanto es importante que todo el sitio este protegido ya que si tan solo una pagina no lo esta queda la posibilidad de que intercepten la sesión en esa única página.

Note que el prerrequisito para todo lo que viene a continuacion es tener instalado nginx.

Generar llaves y CSR

Primero que nada tenemos que generar una llave privada para el servidor, lo cual logramos corriendo este comando en la terminal usare mi dominio para el ejemplo pero ustedes deben reemplazarlo con el suyo:

openssl genrsa -out /etc/ssl/private/ricardogeek.com.key 2048

Aquí generamos una llave privada rsa de longitud 2048 bites. 2048 es el tamaño justo para no desperdiciar CPU y estar seguros al mismo tiempo.

ahora con esa llave que acabamos de generar necesitamos generar nuestro CSR por sus siglas en ingles Certificate Signing Request. 

openssl req -new -key /etc/ssl/private/ricardogeek.com.key -out /etc/ssl/private/ricardogeek.com.csr

Cuando les pregunte sobre su FQDN (fully qualified domain name) escriben su nombre de dominio, en mi caso www.ricardogeek.com y dejamos el password en blanco para practicidad.

luego hay que cerrar los permisos de lectura de este archivo para que solo pueda ser leído por root

chmod 0400 /etc/ssl/private/ricardogeek.com.*

Obtener el certificado

Ahora viene la parte que no nos gusta porque los certificados SSL tienen que estar validados por alguna autoridad en el mercado. Afortunadamente para nosotros, SSLS.com los tiene muy economicos, desde $4.99 al año que es mas o menos lo que te cuesta un latte hipster 🙂

screen-shot-2016-11-28-at-4-39-54-pm
Esto no es un anuncio 🙂 es una recomendación de buena fe.

El proceso toma aproximadamente una hora. Cuando tengan el certificado hay que ponerlo en esta ruta:

/etc/ssl/certs/ricardogeek.com.crt

Ademas de este archivo crt SSL hara entrega de dos certificados intermediarios los cuales deben instalarse, de la siguiente manera.

Los nombres de los archivos van a ser algo asi:

COMODORSAAddTrustCA.crt
COMODORSADomainValidationSecureServerCA.crt

Y para que todo funcione debemos concatenar ambos archivos, cuidando el orden de la concatenación.

cat /etc/ssl/certs/ricardogeek.com.crt /etc/ssl/certs/COMODORSADomainValidationSecureServerCA.crt /etc/ssl/certs/COMODORSAAddTrustCA.crt > /etc/ssl/certs/ricardogeek.com.certchain.crt

esto produce el archivo ricardogeek.com.certchain.crt en /etc/ssl/certs

Acto seguido ya solo tenemos que decirle a nuestro nginx donde estan los certificados en el bloque server:

server {
    server_name ricardogeek.com;
    listen 443 ssl;
    ssl_certificate /etc/ssl/certs/ricardogeek.com.certchain.crt;
    ssl_certificate_key /etc/ssl/private/ricardogeek.com.key;
....
}

Y reiniciar el servicio:

service nginx reload

o bien:

sudo nginx -s reload

A partir de este punto todo el sitio debería poder ser accedido por HTTPS, pero falta la mejor parte que es forzar a que todo el tráfico use HTTPS aun cuando entre en HTTP plano.

Para ello debemos agregar lo siguiente a nuestro bloque server

server {
	listen 80 default_server;
	listen [::]:80 default_server;
	server_name ricardogeek.com www.ricardogeek.com;
	return 301 https://$server_name$request_uri;
...
}

Esto produce una redirección permanente (301 redirect), lo que significa que los navegadores recordarán que cuando el usuario entre aquí, tiene que irse a https.

No deberían olvidar jamás poner https en todos sus métodos, POST, GET, DELETE y cualesquiera que sean. Para evitar cualquier incidencia.

Espero que el post sea de su utilidad.

Saludos.

Categorized in: