Compartir en Twitter
Go to Homepage

CONFIGURAR HTTPS EN ENTORNO DE DESARROLLO LOCAL

November 7, 2025

Introducción a HTTPS en entornos locales

La seguridad web es un pilar fundamental en el desarrollo de aplicaciones modernas. La mayoría de los sitios web actuales utilizan HTTPS para proteger la comunicación entre el cliente y el servidor, garantizando la confidencialidad, integridad y autenticidad de los datos. Sin embargo, los entornos de desarrollo locales suelen operar bajo HTTP por defecto, lo que genera problemas al intentar conectar con servidores remotos protegidos por HTTPS. Este tutorial explica cómo configurar HTTPS en tu entorno de desarrollo local, específicamente en localhost, utilizando OpenSSL para generar certificados SSL válidos. Este proceso es esencial para desarrollo web seguro, ya que permite replicar las condiciones de producción en un entorno controlado.

En este artículo, aprenderás a crear un certificado raíz SSL, emitir certificados para dominios locales, configurarlos en tu sistema operativo y aplicarlos a un servidor local. Además, se abordan los problemas comunes, como el error NET::ERR_CERT_COMMON_NAME_INVALID en navegadores modernos, y cómo solucionarlos asegurando que los certificados incluyan el campo subjectAltName, un requisito actual para navegadores como Chrome. Este tutorial está diseñado para desarrolladores que buscan implementar HTTPS en localhost de manera eficiente y profesional.

Por qué necesitas HTTPS en desarrollo local

Cuando desarrollas aplicaciones web, es común interactuar con APIs o servicios remotos que requieren conexiones seguras. Los servidores protegidos por HTTPS rechazan solicitudes provenientes de orígenes no seguros, como http://localhost. Este problema se ha vuelto más relevante con la adopción masiva de HTTPS en producción. Configurar HTTPS en tu entorno local no solo resuelve este inconveniente, sino que también te permite probar funcionalidades que dependen de conexiones seguras, como Service Workers o ciertas APIs del navegador.

Además, los navegadores modernos han implementado restricciones más estrictas para certificados SSL. Desde 2017, navegadores como Chrome exigen que los certificados incluyan el campo subjectAltName en lugar de depender únicamente del Common Name (CN). Esto significa que los certificados generados con métodos antiguos pueden fallar, resultando en errores que impiden el acceso a tu servidor local. A continuación, se detalla un proceso actualizado para generar certificados válidos y configurarlos correctamente.

Generar un certificado raíz SSL

El primer paso para habilitar HTTPS en tu entorno local es crear un certificado raíz SSL. Este certificado actúa como una autoridad de certificación (CA) que firmará los certificados de dominio específicos, como el de localhost. Usaremos OpenSSL, una herramienta de código abierto ampliamente utilizada para la gestión de certificados SSL.

Crear la clave privada del certificado raíz

Comienza generando una clave privada RSA-2048, que será la base para el certificado raíz. Ejecuta el siguiente comando en tu terminal:

openssl genrsa -des3 -out rootCA.key 2048

Este comando genera una clave privada cifrada con DES3 y la guarda en el archivo rootCA.key. Durante el proceso, se te pedirá que ingreses una contraseña. Esta contraseña será necesaria cada vez que uses la clave para firmar certificados, así que guárdala en un lugar seguro.

Crear el certificado raíz

Con la clave privada generada, el siguiente paso es crear el certificado raíz. Este certificado tendrá una validez de 1,024 días, aunque puedes ajustar este valor según tus necesidades. Ejecuta el siguiente comando:

openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 1024 -out rootCA.pem

Este comando crea un certificado autofirmado (rootCA.pem) utilizando la clave privada rootCA.key. Durante la ejecución, se te pedirá que ingreses información como el país, estado, organización, etc. Puedes completar estos campos o dejarlos en blanco presionando Enter, ya que no son estrictamente necesarios para un entorno local.

El archivo rootCA.pem es tu certificado raíz, que usarás para firmar certificados de dominio específicos. Asegúrate de almacenarlo en un lugar seguro, ya que comprometer este archivo podría permitir la emisión de certificados fraudulentos.

Hacer que el sistema confíe en el certificado raíz

Antes de emitir certificados para localhost, debes configurar tu sistema operativo para que confíe en el certificado raíz. Esto asegura que los certificados firmados por este raíz sean reconocidos como válidos por tu navegador y otras aplicaciones.

Configuración en macOS

Si usas macOS, sigue estos pasos para agregar el certificado raíz al llavero del sistema:

  1. Abre la aplicación Acceso a Llaveros (Keychain Access) en tu Mac.
  2. Selecciona la categoría Certificados en el llavero del sistema.
  3. Importa el archivo rootCA.pem utilizando el menú Archivo > Importar ítems.
  4. Una vez importado, haz doble clic en el certificado y, en la sección Confianza, selecciona Confiar siempre en el menú desplegable “Cuando se use este certificado”.

Tras completar estos pasos, el certificado raíz aparecerá como confiable en tu sistema, y los certificados firmados por él serán aceptados automáticamente.

Configuración en Windows

En Windows, puedes agregar el certificado raíz al almacén de certificados confiables siguiendo estos pasos:

  1. Abre el archivo rootCA.pem con un doble clic. Windows abrirá el Asistente para importar certificados.
  2. Selecciona Almacén de certificados y elige Autoridades de certificación raíz de confianza.
  3. Completa el asistente para importar el certificado.

Este proceso asegura que tu sistema reconozca el certificado raíz como una autoridad confiable.

Configuración en Linux

En distribuciones basadas en Ubuntu o Debian, puedes agregar el certificado raíz al almacén de certificados del sistema con los siguientes comandos:

sudo cp rootCA.pem /usr/local/share/ca-certificates/rootCA.crt
sudo update-ca-certificates

Esto copia el certificado al directorio de certificados confiables y actualiza el almacén de certificados del sistema. Verifica las instrucciones específicas para tu distribución si usas otra variante de Linux.

Generar un certificado SSL para localhost

Con el certificado raíz configurado, el siguiente paso es emitir un certificado específico para localhost. Esto requiere crear una clave privada, una solicitud de firma de certificado (CSR) y un certificado firmado que incluya el campo subjectAltName para cumplir con los requisitos modernos de los navegadores.

Crear un archivo de configuración para el certificado

Para simplificar la generación del certificado, crea un archivo de configuración OpenSSL llamado server.csr.cnf. Este archivo define los parámetros del certificado, como el nombre del dominio (localhost) y otros detalles. Crea el archivo con el siguiente contenido:

[req]
default_bits = 2048
prompt = no
default_md = sha256
distinguished_name = dn

[dn]
C=US
ST=RandomState
L=RandomCity
O=RandomOrganization
OU=RandomOrganizationUnit
emailAddress=[email protected]
CN=localhost

Guarda este archivo como server.csr.cnf. Este archivo asegura que los parámetros del certificado se apliquen de manera consistente sin necesidad de ingresarlos manualmente.

Especificar el campo subjectAltName

El campo subjectAltName es obligatorio para que los navegadores modernos acepten el certificado. Crea un archivo llamado v3.ext con el siguiente contenido:

authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names

[alt_names]
DNS.1 = localhost

Este archivo especifica que el certificado es válido para el dominio localhost. El campo subjectAltName asegura que el certificado cumpla con las políticas de seguridad de navegadores como Chrome.

Generar la clave privada y la solicitud de firma

Ahora, genera una clave privada para localhost y una solicitud de firma de certificado (CSR) utilizando el archivo de configuración:

openssl req -new -sha256 -nodes -out server.csr -newkey rsa:2048 -keyout server.key -config server.csr.cnf

Este comando genera dos archivos:

  • server.key: La clave privada para el certificado de localhost.
  • server.csr: La solicitud de firma de certificado, que se usará para generar el certificado final.

Firmar el certificado con el certificado raíz

Usa el certificado raíz y su clave privada para firmar la solicitud de certificado y generar el certificado final para localhost. Ejecuta el siguiente comando:

openssl x509 -req -in server.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out server.crt -days 500 -sha256 -extfile v3.ext

Este comando produce el archivo server.crt, que es el certificado SSL para localhost con una validez de 500 días. El parámetro -extfile v3.ext asegura que el campo subjectAltName se incluya en el certificado.

Configurar el servidor local con HTTPS

Con los archivos server.key y server.crt generados, estás listo para configurar tu servidor local para usar HTTPS. La forma de hacerlo depende del entorno de desarrollo que utilices. A continuación, se muestra un ejemplo para una aplicación Express en Node.js.

Ejemplo: Configurar HTTPS en Express

En un proyecto de Node.js con Express, puedes configurar HTTPS utilizando el módulo https integrado. Asegúrate de tener los archivos server.key y server.crt en el directorio de tu proyecto. Crea un archivo server.js con el siguiente contenido:

const https = require("https");
const fs = require("fs");
const express = require("express");
const app = express();

const options = {
    key: fs.readFileSync("server.key"),
    cert: fs.readFileSync("server.crt"),
};

app.get("/", (req, res) => {
    res.send("¡Hola, mundo! Este es un servidor HTTPS.");
});

https.createServer(options, app).listen(443, () => {
    console.log("Servidor HTTPS corriendo en https://localhost");
});

Para ejecutar el servidor, asegúrate de tener Express instalado (npm install express) y ejecuta:

node server.js

Abre tu navegador y navega a https://localhost. Deberías ver la página sin errores de certificado, ya que el navegador confía en el certificado raíz y, por lo tanto, en el certificado de localhost.

Nota importante para producción

El método descrito en este tutorial es adecuado únicamente para entornos de desarrollo local. En producción, debes usar certificados emitidos por una autoridad de certificación reconocida, como Let’s Encrypt, para garantizar la seguridad y la confianza de los usuarios.

Solucionar problemas comunes

Al configurar HTTPS en un entorno local, puedes encontrarte con errores comunes. Aquí se describen algunos de los más frecuentes y cómo solucionarlos:

  • Error NET::ERR_CERT_COMMON_NAME_INVALID: Este error ocurre si el certificado no incluye el campo subjectAltName. Asegúrate de incluir el archivo v3.ext al generar el certificado de localhost.
  • El navegador no confía en el certificado: Verifica que el certificado raíz (rootCA.pem) esté correctamente importado y configurado como confiable en tu sistema operativo.
  • Errores de contraseña en OpenSSL: Si olvidaste la contraseña de la clave rootCA.key, deberás generar una nueva clave y certificado raíz.

Si encuentras otros problemas, revisa la documentación de OpenSSL o los registros de tu servidor para obtener más detalles.

Automatizar la generación de certificados

Si prefieres evitar ejecutar comandos manualmente, puedes crear un script para automatizar la generación de certificados. A continuación, se muestra un ejemplo de un script Bash que combina todos los pasos descritos:

#!/bin/bash

# Generar clave y certificado raíz
openssl genrsa -des3 -out rootCA.key 2048
openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 1024 -out rootCA.pem

# Crear archivo de configuración para localhost
cat > server.csr.cnf << EOL
[req]
default_bits = 2048
prompt = no
default_md = sha256
distinguished_name = dn

[dn]
C=US
ST=RandomState
L=RandomCity
O=RandomOrganization
OU=RandomOrganizationUnit
[email protected]
CN=localhost
EOL

# Crear archivo de extensión para subjectAltName
cat > v3.ext << EOL
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names

[alt_names]
DNS.1 = localhost
EOL

# Generar clave y solicitud para localhost
openssl req -new -sha256 -nodes -out server.csr -newkey rsa:2048 -keyout server.key -config server.csr.cnf

# Firmar el certificado
openssl x509 -req -in server.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out server.crt -days 500 -sha256 -extfile v3.ext

Guarda este script como generate_certs.sh, dale permisos de ejecución (chmod +x generate_certs.sh) y ejecútalo (./generate_certs.sh). Este script generará todos los archivos necesarios en el directorio actual.

Conclusiones

Configurar HTTPS en un entorno de desarrollo local es un paso crucial para alinear tu entorno de desarrollo con las prácticas de seguridad modernas. Al generar un certificado raíz SSL y un certificado específico para localhost con OpenSSL, puedes replicar las condiciones de un servidor de producción, asegurando que tus aplicaciones funcionen correctamente con APIs y servicios remotos protegidos por HTTPS. Este tutorial ha cubierto cada paso del proceso, desde la creación de certificados hasta la configuración de un servidor Express con HTTPS, incluyendo soluciones para errores comunes como NET::ERR_CERT_COMMON_NAME_INVALID. Además, se ha proporcionado un script para automatizar el proceso, facilitando la implementación para desarrolladores ocupados.

Al seguir estas instrucciones, puedes implementar HTTPS en tu entorno local de manera eficiente y garantizar que tu flujo de trabajo de desarrollo sea seguro y compatible con los estándares modernos. Este enfoque no solo mejora la seguridad, sino que también te prepara para trabajar con tecnologías que dependen de conexiones seguras, asegurando una transición fluida hacia entornos de producción.