<Tip/> Configurar un servidor HTTPS con Nginx

Dudaba sobre si hacer esta entrada o no, ya que hay mucha documentación al respecto en la red (aunque algo desordenada a mi entender), pero la principal motivación del blog es que las entradas me sirvan a mi mismo, así que prefiero publicarlo a que quede perdido en una nota de Evernote.

Bueno vamos a ello, disponer de una conexión https en nuestro sitio web nos brinda varias ventajas, por un lado nos proporciona un plus de seguridad al encriptar  la conexión del sitio, y por otro ayuda a mejorar el SEO del mismo, ya que Google premia los sitios que disponen de este tipo de conexión.

Esta entrada no pretende ser una guía muy exhaustiva simplemente expondré los pasos necesarios para crear y configurar un certificado SSL en un servidor Nginx.

Paso 1: Generar la clave privada (.key)

Nos conectamos a nuestro servidor y generamos la clave privada con openssl en el directorio /etc/ssl. Nos solicitará que creemos una contraseña.

cd /etc/ssl/
sudo openssl genrsa -des3 -out tudominio.key 2048 

Paso 2: Crear la solicitud de certificado (.csr)

Para generar una solicitud de firma de certificado lo que se denomina como Certificate Signing Request (CSR), ejecutamos lo siguiente:

sudo openssl req -new -newkey rsa:2048 -nodes -keyout tudominio.key -out tudominio.csr

Introducimos la información solicitada:
Country Name (AU): El formato de dos letras de tu país
State or Province (S): Nombre del estado o provincia en donde se encuentra tu organización. No es obligatorio.
Locality or City (L): Nombre de la ciudad en la que está registrada o se encuentra tu organización. No es obligatorio.
Organization (O): El nombre legalmente registrado para tu negocio. Si te inscribes como un individuo, ingresa el nombre del certificado del solicitante.
Organization Unit: No es obligatorio, se refiera al nombre DBA (Doing Business As).
Common Name (CN): El nombre de dominio completo o dirección URL que quieras asegurar. Si estás solicitando un certificado Wildcard, agrega un asterisco (*) a la izquierda del nombre común, por ejemplo, *.coolexample.com.
Una vez completado el formulario nos solicitará otro password, este es opcional, si lo creamos cada vez que reiniciemos Nginx deberemos introducirlo.

Paso 3: Generar los certificados intermedios (.crt)

Copia el contenido de todo el fichero CSR generado y pégalo/subelo a la autoridad certificadora. En mi caso lo hice con GoDaddy, ya que tenían los certificados a 5$. En este paso se generán dos certificados intermedios.

Paso 4: Contatenar los certificados intermedios (.crt)

A continuación debemos concatenar los certificados intermedios generados en el paso anterior.¡ (da igual el orden).

cat certificado1.crt certificado2.crt >> tudominio.crt

Paso 5: Configurar Nginx

Subimos el certficado a nuestro servidor al directorio /etc/ssl/ y editamos nuestro fichero de configuración de Nginx tal que así:

server {
listen 443;
server_name tudominio.com;

root /var/www/;
index index.html index.htm;

ssl on;
ssl_certificate /etc/ssl/tudominio.crt;
ssl_certificate_key /etc/ssl/tudominio.key;
}

Si además queremos que todo nuestro trafico http sea redireccionado a https añadimos lo siguiente:

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

En principio esto es todo lo que necesitamos para hacer uso del protocolo seguro de HTTPS en nuestro servidor, cualquier duda que tengais no dudeis en comentarla.

<Tip/> Configurar un servidor HTTPS con Nginx
4.9 (97.5%) 8 votos
3 comentarios
  1. Bernardo Garcia
    Bernardo Garcia Dice:

    Genial Miguel.
    De pronto tal vez ¿Ha podido sucederte el problema de que en Nginx, las urls solo retornen con el 127.0.0.1?

    Es un poco lo que aquí se describe. http://stackoverflow.com/questions/19669376/django-rest-framework-absolute-urls-with-nginx-always-return-127-0-0-1

    A mi me ha sucedido utilizando este tutorial

    https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-django-with-postgres-nginx-and-gunicorn

    Sé que las directivas clave de configuración están en la parte de server_name y las de proxy, pero no logré dar con la causa cuando empecé a usar Amazon EC2 y básicamente por esta razón me vi obligado a utilizar Heroku.

    Disculpas por poner tantos enlaces en este comentario.
    Saludos

    Responder
  2. Miguel A. Gómez
    Miguel A. Gómez Dice:

    Hola Bernardo,

    Disculpa la demora en responderte ando hasta arriba de trabajo. La verdad es que no me he topado nunca con ese problema, pero a priori parece que tengas algún error en la configuración de tu nginx. ¿Cómo realizabas el deployment? ¿Lo tenias automatizado con Ansible o algún orquestador? Te recomiendo que antes de poner en producción tu proyectos, reproduzcas la maquina de producción en un servidor local con Vagrant, y una vez tengas totalmente optimizada dicha máquina, prepares una igual para el deployment. Te será mucho más sencillo dar con el error de configuración, y además tendrás la infraestructura de tu maquina en código.
    En próximas entradas voy a escribir sobre este tema, un saludo.

    Responder
    • Bernardo Garcia
      Bernardo Garcia Dice:

      Hola Miguel.

      No te preocupes por lo de el tiempo para responder, todos hacemos el mejor esfuerzo.

      Mi deployment lo realizaba al decir verdad de manera muy básica instalando, configurando y automatizando lo que es nginx, gunicorn y postgresql.

      Pero cuando digo automatizando es simplemente los procesos de inicialización de éstas entidades en el sistema operativo a un nivel básico, es decir tipo /etc/init.d/, por lo que no he contado con procesos o politicas tipo DevOPs como las alternativas que me compartes.

      En el primer comentario comparti el url del cual me base para mi deployment que era un tutorial de DIgital Ocean muy basico, pero creo que por el background negro de tu blog no se detallan los links que uno pone en los comentarios.

      https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-django-with-postgres-nginx-and-gunicorn

      Si he querido replicar o tener mi infraestructura de manera local, realmente esto es algo que tengo que tener.

      ¿Tienes algun tipo de feed RSS para tu blog?
      Muchas gracias Miguel por tomarte el tiempo de responder y compartir cosas.
      Saludos.

      Responder

Dejar un comentario

¿Quieres unirte a la conversación?
Siéntete libre de contribuir

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *