Configurar un certificado SSL emitido por Godaddy.com en Nginx que se encuentra detrás de AWS Elastic Load Balancer + Cloudflare

Cuando es necesario cifrar las conexiones de nuestro website para protegerlos de datos que son sensibles debemos contar con un certificado SSL. Muchas compañías ofrecen este servicio, donde por un precio accesible se puede adquirir un certificado SSL. Godaddy.com es uno de estos proveedores que ofrecen este tipo de servicios de venta de certificados SSL. Dicho esto, el escenario en el que se basará este pequeño post es el siguiente; el dominio es administrado por Cloudflare, se cuenta con dos (2) instancias en Amazon Web Services EC2 que se acceden a ellas mediante el balanceo de cargas usando la tecnología desarrollada por Amazon Web Service llamada Elastic Load Balancer, también la idea es que al acceder desde el dominio principal usando el protocolo HTTP, el servidor web Nginx que esta instalado en las instancias de AWS EC2 redireccione el trafico al protocolo HTTPS. Ahora describiré luego de haber adquirido/comprado un certificado SSL en Godaddy.com, lo siguiente:

  1. Generar una solicitud de firma de certificado para un servidor NGINX.

  2. Instalar el certificado SSL en Elastic Load Balancer de Amazon Web Services.

  3. Configurar un virtualhost en Nginx para redireccionar desde HTTP hacía HTTPS.

1. Generar una solicitud de firma de certificado para un servidor NGINX

Si ya contamos con la compra de una solicitud para un certificado SSL en Godaddy.com deberemos ahora generar una solicitud de firma de certificado (CSR) para nuestro servidor. En este ejemplo usado como escenario, se esta usando la tecnología ofrecida por Amazon Web Service  llamada Elastic Load Balancer para distribuir automáticamente todo el tráfico entrante y direccionarlo a dos (2) instancias de Amazon Web Services EC2, usaremos una de ellas para conectarnos y generar la solicitud de firma de certificado, deberemos entonces y de acuerdo a la distribución GNU/Linux, instalar el paquete openssl y sus dependencias. Para CentOS 7 y Fedora 20 tendremos que ejecutar en la línea de comandos en la instancia elegida para generar la solitud lo siguiente:

# yum install openssl openssl-libs

Luego de instalados los paquetes de openssl, ejecutaremos el comando openssl para generar dos archivos, uno es la clave privada para el cifrado del certificado SSL y el segundo archivo es usado para generar la solicitud de firma de certificado que es utilizado en Godaddy.com para solicitar el certificado SSL, en la línea de comandos escribimos:

# openssl req -new -newkey rsa:2048 -nodes -keyout dominio.key -out dominio.csr

Es de mencionar que el nombre de los archivos generados con extensiones .key y .csr tendrán que llamarse como tu dominio para el cual estas generando el certificado SSL. Se nos pedirán una seríe de datos al que deberemos ir contestando, dejo un ejemplo de la salida al ejecutar el comando openssl y lo que deberíamos introducir:

Country Name (2 letter code) [XX]: AR
State or Province Name (full name) []: Capital Federal
Locality Name (eg, city) [Default City]: Buenos Aires
Organization Name (eg, company) [Default Company Ltd]:Dominio.com
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []: *.dominio.com      
Email Address []: tucorreo

Debo mencionar que si adquiriste un Certificados Wildcard SSL para ser usado con múltiples servidores y subdominios ilimitado, tendrás que colocar en la pregunta "Common Name (eg, your name or your server's hostname) []:" tu dominio y anteponer un asterisco, por ejemplo, *.tudominio.com . Ahora tendremos que abrir el archivo generado de nombre dominio.csr, copiar todo su contenido y pegarlo en el formulario de inscripción SSL de la cuenta de Godaddy.com . Realizado lo anterior, iremos en las opciones de administración de certificados y descargareemos el certificado, en tipo de servidor seleccionamos Apache y descargaremos el archivo zip.

 

2. Instalar el certificado SSL en Elastic Load Balancer de Amazon Web Services

Ahora que tenemos el certificado SSL descargado desde la cuenta de Godaddy.com lo instalaremos en el servicio que ofrece Elastic Load Balancer de Amazon Web Services, para ellos tendremos que ir hasta la sección que se encuentra en EC2 Dashboard > Network & Security > Load Balancers. En mi caso, como ya tengo creado un balanceador de carga, lo selecciono y me traslado a la pestaña de nombre Listeners. En esta sección, agregaremos un nuevo socket de escucha en el puerto 443 con el siguiente formato:

Load Balancer Protocol

Load Balancer Port Instance Protocol Instance Port Cipher SSL Certificate
HTTP 80 HTTP 80 N/A N/A
HTTPS 443 HTTPS 443 Change Change

Cuando agregamos un nuevo puerto del protocolo HTTPS, en la columna SSL Certificate, se activa la opción Change donde nos permitirá agregar los certificados descargados desde Godaddy. Al entrar en esta sección, seleccionaremos Upload a new SSL Certificate, ahora bien para los campos que nos piden colocaremos:

En Certificate Name:* un nombre de referencia para el certificado, por ejemplo, el nombre de tu dominio.

Para Private Key:* tendremos que colocar el contenido de la llave privada generada al principio del articulo, como AWS ELB nos pide que sea con el formato pem, ejecutaremos en la shell lo siguiente, utilizando el comando openssl:

$ openssl rsa -in dominio.key -outform PEM

En Public Key Certificate:* colocaremos el contenido del archivo con extensión .crt y de numeración como nombre, que ha sido descargado desde Godaddy.com, nuevamente como AWS ELB nos pide que sea con el formato pem, ejecutaremos en la shell lo siguiente:

$ openssl x509 -inform PEM -in 12635474839.crt

Para Certificate Chain, este campo es opcional, pero se coloca es el contenido del segundo archivo que es descargado desde Godaddy.com y que normalmente recibe el nombre de bundle, nuevamente como AWS ELB nos pide que sea con el formato pem, ejecutaremos en la shell lo siguiente:

$ openssl x509 -inform PEM -in gd_bundle-g2-g1.crt

Procedemos a guardar los cambios, si los datos son correctos, en listado de los Elastic Load Balancers, en la columna que lleva por nombre Port Configuration deberiamos ver un texto parecido al siguiente:

80 (HTTP) forwarding to 80 (HTTP), 443 (HTTPS, Certificate: tudominio) forwarding to 443 (HTTPS)

Configuraremos ahora el Health Check usado por Elastic Load Balancer, nos trasladamos hasta la solapa, cambiamos el puerto y la ruta hacía donde se hará los respectivos ping, será algo como lo siguiente:

Ping Procotol HTTPS
Ping Port 443
Ping Path /

Esto será necesario para que Elastic Load Balancer, haga sus respectivos ping y compruebe que las instancias EC2 se encuentran activas.

3. Configurar un Virtualhost en Nginx para redireccionar desde HTTP hacía HTTPS

Ahora, es necesario redireccionar todo el trafico que viene desde el protocolo HTTP hacía HTTPS, en este escenario usado como ejemplo, el dominio es administrado desde Cloudflare, por lo que primero, tendremos que ir al Dasboard en Cloudflare, y ubicamos la sección llamada Cloudflare Settings del dominio. En esta sección en el apartado relacionado con los Certificados SSL, Se encontrará selecciona como Flexible SSL o en muchas casos se encontrará como Off , deberemos cambiarlo hacía Full SSL. Guardamos los cambios en Cloudflare, para poder continuar con este post.

Editaremos en Nginx, que esta instalado en las dos (2) instancias EC2 de Amazon Web Services, el virtualhost utilizado para nuestro dominio principal,se editaá con lo siguiente:

upstream python-website {
    server unix:/tmp/uwsgi.sock;
}

server {
   listen 80 default;
   server_name dominio.com;
   location / {
       if ($http_x_forwarded_proto != 'https') {
           return 301 https://$server_name$request_uri;
       }
   }
}

server {
    listen 443 ssl;
    server_name dominio.com;
    ssl_certificate /etc/ssl/dominio.com/12635474839.crt;
    ssl_certificate_key /etc/ssl/dominio.com/dominio.key;
    ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
    
    charset utf-8;
    root /home/www/dominio;
    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

   location / {

        include uwsgi_params;
        uwsgi_ pass python-website;
        uwsgi_param UWSGI_SCRIPT wsgi;
        uwsgi_param UWSGI_CALLABLE app;
        uwsgi_read_timeout 900;

	}

}

El ejemplo visto anteriormente es un aplicación escrita en Python, donde Nginx se conecta a través del socket que genera UWSGI para mostrar el desarrollo. En el ejemplo vemos que se han usado dos Server Block, en el primer indicamos que todo el trafico que entra por el puerto 80 (protocolo HTTP) con server name dominio.com responda indicando el status code 301 y luego, sea redireccionado al segundo server block que tiene como puerto de escucha 443 (protoloco HTTPS) y las rutas al certificado SSL descargado desde la cuenta de Godaddy.com y que deberán estar ubicadas o hosteadas en las instancias EC2.

Hasta acá, este pequeño post, si conoces otra forma de instalar los certifcados SSL en Elastic Load Balancer de Amazon Web Services, dejame tu historia en la caja de comentarios.