Cómo crear certificados SSL con Docker para trabajar en entorno local

5 min.

Hoy vamos a utilizar un pequeño proyecto con Docker que nos permite generar certificados SSL autofirmados para poder trabajar sobre HTTPS en local.

Los certificados los vamos a generar para un nombre de dominio real, y vamos a preparar el entorno para WordPress que montamos en el anterior post en el que explicábamos cómo trabajar Wordpess con Docker en localhost, para que funcione con este nuevo dominio bajo HTTPS.

Para conseguirlo vamos a realizar los siguientes pasos:

Generando el certificado SSL

Como he dicho antes, para generar el certificado, vamos a utilizar un pequeño proyecto que tengo en Github:

https://github.com/estokari/sslmaker

Sólo tienes que clonarte el repositorio y ejecutar un comando pasándole el nombre de dominio para el que quieres que genere el certificado.

En cualquier carpeta de tu mac o pc (se ordenado/a y guarda esto en tu sitio favorito de herramientas 😉 ), ejecuta lo siguiente:

git clone https://github.com/estokari/sslmaker.git sslmaker

Una vez clonado, accede a la carpeta y compila el proyecto:

cd sslmaker
docker-compose build

Ahora ya puedes generar certificados ejecutando lo siguiente:

docker-compose run sslmaker dockerwp.com

Fíjate que el último parámetro del comando que acabamos de ejecutar es el nombre de dominio para que el queremos el certificado: dockerwp.com

Los certificados se crean dentro del contenedor, en /etc/ssl/certs/ y al estar esa ruta mapeada con nuestra maquina, podemos acceder a ellos para instalarlos en el navegador:

Instalando el certificado en el navegador

El la barra de navegación de tu chrome accede a chrome://settings/security y accede a la gestión de certificados:

En mi caso, al utilizar Mac me abre la app Keychain para gestionarlos, lo que hago es añadir el archivo con la extensión .crt que ha generado sslmaker

Una vez añadido, cambio su configuración para que el navegador “confie” en este certificado autofirmado:

Mapeando el nuevo dominio con localhost

Bien, ya tenemos el certificado para ese dominio en nuestro navegador, ahora vamos a decirle a nuestro ordenador, que cuando accedamos a https:://dockerwp.com, resuelva la ip de localhost, que es 127.0.0.1

Para ello vamos a añadir una línea al fichero hosts, lo editamos:

sudo vim /etc/hosts

Añadimos lo siguiente al final del archivo y guardamos:

127.0.0.1 dockerwp.com

Añadiendo el certificado y el nuevo dominio a la configuración de Nginx

Es hora de decirle a nuestro contenedor que actúa como servidor web, que vamos a trabajar con un dominio diferente a localhost y bajo HTTPS.

Para conseguirlo, modificamos el archivo de configuración de Nginx, ahora lo tenemos así:

server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name 127.0.0.1;
    ...

Y tenemos que modificarlo para que quede de la siguiente manera:

server {
    listen 80 default_server;
    listen [::]:80 default_server;

    listen 443 ssl http2;
    listen [::]:443 ssl;

    ssl_certificate /etc/ssl/dockerwp.com.crt;
    ssl_certificate_key /etc/ssl/dockerwp.com.key;

    server_name dockerwp.com;
    ...

Te describo a continuación los cambios que hemos hecho:

Genial, nos queda copiar los archivos del certificado que hemos generado antes a nuestro proyecto y realizar un par de cambios en la configuración de nuestro docker-compose.

Crea una carpeta nueva en el proyecto para mapear los archivos del certificado de nuestra máquina al contenedor:

mkdir /nginx/ssl

Y coloca una copia de los archivos del certificado en esa carpeta.

Ahora mapeamos en el servicio de Nginx de nuestro docker-compose la carpeta que acabamos de crear con el contenedor:

dockerwp_nginx:
    build: ./nginx/
    container_name: ${PROJECT_NAME}_nginx
    volumes:
      - "./nginx/conf:/etc/nginx/conf.d"
      - "./nginx/ssl:/etc/ssl/"
      - "./www:/var/www/html/"
    ports:
      - "$NGINX_HTTP_PORT:80"
      - "$NGINX_HTTPS_PORT:443"
    depends_on:
          - dockerwp_php
          - dockerwp_db

Fíjate que en la línea 6 realizamos el mapeo

Y añadimos en la línea 10 un nuevo puerto por el cual el contenedor debe escuchar, el 443, que es el puerto por defecto para HTTPS.

Para ello hemos tenido que crear una nueva variable en nuestro archivo .env, quedando éste de la siguiente forma:

# Project
PROJECT_NAME=dockerwp

# Nginx
NGINX_HTTP_PORT=80
NGINX_HTTPS_PORT=443
...

Date cuenta que en la línea 6 hemos agregado la variable NGINX_HTTPS_PORT con el valor 443

Genial, con esto ya nuestro Nginx puede servir contenido bajo HTTPS para el dominio dockerwp.com.

Para verlo en funcionamiento, edita el archivo index.php de la instalación del WordPress de este proyecto y agrega lo siguiente:

<?php
phpinfo();
die();

Con esto estamos mostrando la información de PHP con phpinfo(); y cortando la ejecución con die(); para que no conecte con la Base de datos ya que aún nos falta reemplazar algunas cadenas para que WordPress funcione por HTTPS.

Ahora accede en tu navegador a https://dockerwp.com, si todo ha ido bien, deberías estar viendo esto:

Cambiando localhost por el nuevo dominio en la base de datos de WordPress

Llegados a este punto, lo único que nos queda es hacer el reemplazo de dominio para que WordPress funcione accediendo a https://dockerwp.com en vez de con http://localhost.

Para lograrlo vamos a utilizar el contenedor de WP-CLI que añadimos al proyecto en el anterior post que trata sobre cómo añadir WP-CLI a WordPress con Docker

Antes de nada, vuelve a dejar el archivo index.php como estaba, después, desde la raíz de la instalación de WordPress, en la línea de comandos, ejecuta lo siguiente:

dockerwp search-replace 'http://localhost:8000' 'https://dockerwp.com'

Como puedes ver, con WP-CLI reemplazamos todas las cadenas que encuentre con http://localhost:8000 por https://dockerwp.com:

Si todo ha ido como debería, podemos acceder a nuestra instalación de WordPress anterior pero ahora accediendo a https://dockerwp.com:

Conclusión

Como ves, generar certificados autofirmados y utilizarlos en nuestros proyectos con Docker para trabajar en local es algo fácil de realizar siguiendo estos pasos.

En mi caso me resulta muy útil cuando necesito clonar un proyecto desde un entorno de producción a un entorno local, puedes clonar el proyecto entero sin tener que hacer un solo reemplazo en la Base de datos para hacer funcionar en tu máquina de manera local.

Código realizado en el post

Te dejo el enlace al repositorio con el código que hemos utilizado en este post:

https://github.com/estokari/dockerwp

Añade tu comentario
Este sitio está protegido por reCaptcha y se aplican la Política de privacidad y los Términos de servicio de Google