Original article: How to get HTTPS working on your local development environment in 5 minutes

1*8XwjYNPlrj0paEvIjn0Dcw


Casi cualquier sitio web que visite hoy en día está protegido por HTTPS. Si el tuyo aún no lo está, debe estarlo. Asegurar tu servidor con HTTPS también significa que no puedes enviar peticiones a este servidor desde uno que no esté protegido por HTTPS. Esto plantea un problema para los desarrolladores que utilizan un entorno de desarrollo local porque todos ellos se ejecutan en http://localhost por defecto.

En la startup de la que formo parte, decidimos proteger nuestros endpoints de AWS Elastic Load Balancer con HTTPS como parte de un movimiento para mejorar la seguridad. Me encontré con una situación en la que las solicitudes de mi entorno de desarrollo local al servidor comenzaron a ser rechazadas.

Después de una rápida búsqueda en Google, encontré varios artículos con instrucciones detalladas sobre cómo podía implementar HTTPS en localhost. Ninguna de estas instrucciones parecía funcionar incluso después de seguirlas religiosamente. Chrome siempre me lanzaba un error NET::ERR_CERT_COMMON_NAME_INVALID.

1*cQyGAORXHxsrhs5KRRBOgQ


El problema

Todas las instrucciones detalladas que había encontrado eran correctas para la época en que fueron escritas. Pero ya no.

Después de una tonelada de buscar en Google, descubrí que la razón por la que mi certificado local fue rechazado fue que Chrome había obsoleto el soporte para la coincidencia commonName en certificados, en efecto, requiriendo un subjectAltName desde enero de 2017.

La solución

Usaremos OpenSSL para generar todos nuestros certificados.

Paso 1: Certificado SSL raíz

El primer paso es crear un certificado SSL raíz. Este certificado raíz se puede utilizar para firmar cualquier número de certificados que pueda generar para dominios individuales.

Genere una clave RSA-2048 y guárdela en un archivo rootCA.key. Este archivo se utilizará como clave para generar el certificado SSL raíz. Se le pedirá una contraseña que deberá introducir cada vez que utilice esta clave para generar un certificado.

openssl genrsa -des3 -out rootCA.key 2048

Puede utilizar la clave generada para crear un nuevo certificado SSL raíz. Guárdelo en un archivo llamado rootCA.pem. Este certificado tendrá una validez de 1.024 días. Puedes cambiarlo por el número de días que desees. También se le pedirá otra información opcional.

openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 1024 -out rootCA.pem
1*76xehIse7mPGF094ojiBBw

Paso 2: Confiar en el certificado SSL raíz

Antes de poder utilizar el certificado SSL raíz recién creado para empezar a emitir certificados de dominio, hay un paso más. Debe indicar a su Mac que confíe en su certificado raíz para que también confíe en todos los certificados individuales emitidos por él.

Abra Keychain Access en su Mac y vaya a la categoría Certificados de su llavero Sistema. Una vez allí, importa el rootCA.pem utilizando Archivo > Importar elementos. Haz doble clic en el certificado importado y cambia el desplegable "Al utilizar este certificado:" a Siempre de confianza en la sección Confiar.

Tu certificado debería tener este aspecto dentro de "Keychain Access" si has seguido correctamente las instrucciones hasta ahora.

1*NWwMb0yV9ClHDj87Kug9Ng

Paso 2: Certificado SSL de dominio

Ahora puede utilizar el certificado SSL raíz para emitir un certificado específico para su entorno de desarrollo local ubicado en localhost.

Cree un nuevo archivo de configuración de OpenSSL server.csr.cnf para poder importar esta configuración al crear un certificado en lugar de introducirla en la línea de comandos.

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

[dn]
C=US
ST=RandomState
L=RandomCity
O=RandomOrganization
OU=RandomOrganizationUnit
emailAddress=hello@example.com
CN = localhost


Cree un archivo v3.ext para crear un certificado X509 v3. Observa cómo especificamos subjectAltName aquí.

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

[alt_names]
DNS.1 = localhost

Crea una clave de certificado para localhost utilizando los ajustes de configuración almacenados en server.csr.cnf. Esta clave se almacena en server.key.

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

Se emite una solicitud de firma de certificado a través del certificado SSL raíz que creamos anteriormente para crear un certificado de dominio para localhost. El resultado es un archivo de certificado llamado server.crt.

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

Utilice su nuevo certificado SSL

Ya está listo para asegurar tu localhost con HTTPS. Mueve los archivos server.key y server.crt a una ubicación accesible en tu servidor e inclúyelos al iniciar tu servidor.

En una aplicación Express escrita en Node.js, así es como lo harías. Asegúrate de hacer esto sólo para tu entorno local. No lo uses esto en producción.

1*89r7TnYG49V3zMoUnfOP7Q


Espero que este tutorial te haya resultado útil. Si no te sientes cómodo ejecutando los comandos que se dan aquí por ti mismo, he creado un conjunto de scripts prácticos que puedes ejecutar rápidamente para generar los certificados por ti. Puedes encontrar más detalles en el repositorio de GitHub.

Me encanta ayudar a otros desarrolladores web. Sígueme en Twitter y hazme saber si tienes alguna sugerencia o comentario. Si quieres mostrar tu agradecimiento por el trabajo que he hecho, ya sea una entrada de blog, un proyecto de código abierto o simplemente un tweet divertido, puedes invitarme a un café.