es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo configuro certificados SSL para un CNAME del servidor web con NodeJS / ExpressJS?

Recientemente configuré certificados SSL para un servidor web con NodeJS de manera similar a la siguiente y todo funciona genial:

process.env.HTTPS_PORT = 3000; // Escucha en el puerto 3000 para HTTPS.
process.env.HTTP_PORT = 6000; // Escucha en el puerto 6000 para HTTP.

// Crea un servidor HTTPS para todo el flujo de trabajo.
https
    .createServer(
        {
            key: await fs.readFile('/etc/pki/tls/private/key.txt'),
            cert: await fs.readFile('/etc/pki/tls/certs/xxxxxxxxxxxxxx.crt'),
            ca: await fs.readFile('/etc/pki/tls/certs/gd_bundle-g2-g1.crt'),
        },
        app
    )
    .listen(process.env.HTTPS_PORT, () => {
        console.log(`El servidor principal se está ejecutando en: ${process.env.HTTPS_PORT}`);
    })
    .on('error', (err) => {
        console.log(`Error al iniciar el servidor principal: ${err}`);
    });

// Crea un servidor HTTP para redireccionar solo a HTTPS.
http.createServer(app)
    .listen(process.env.HTTP_PORT, () => {
        console.log(`El servidor de redirección se está ejecutando en: ${process.env.HTTP_PORT}`);
    })
    .on('error', (err) => {
        console.log(`Error al iniciar el servidor de redirección: ${err}`);
    });

Estoy escuchando en dos puertos, uno para HTTPS y el otro para HTTP. El propósito del servidor HTTP es redirigir a HTTPS únicamente, para lo cual tengo una ruta configurada.

Esta configuración funciona para el nombre de dominio totalmente calificado (FQDN) del servidor (app.subdomain1.domain.com). El servidor también tiene un CNAME (web.subdomain2.domain.com). A partir de la investigación que he realizado en este enlace, parece que el CNAME debe manejarse por separado, ya que el navegador aún espera un certificado válido para la URL que solicita el usuario. Se espera que los usuarios utilicen cualquiera de las URL para acceder a la aplicación.

No pude encontrar mucha información sobre cómo configurar certificados SSL con NodeJS / ExpressJS para este tipo de CNAME. Cualquier información al respecto sería realmente útil.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Manejo de certificados SSL para CNAMEs con NodeJS y ExpressJS

    Si has configurado certificados SSL para un servidor web con NodeJS y ExpressJS, y tienes un CNAME apuntando a tu servidor que también deseas manejar con SSL, necesitas configurar un certificado SSL separado para el CNAME.

    La razón de esto es que el navegador aún espera un certificado válido para la URL solicitada por el usuario. Por lo tanto, necesitas obtener un certificado específicamente para el CNAME.

    Una vez que hayas obtenido un certificado para el CNAME, puedes usar el mismo código que antes para configurar el servidor HTTPS:

    https
        .createServer(
            {
                key: await fs.readFile('/etc/pki/tls/private/key.txt'),
                cert: await fs.readFile('/etc/pki/tls/certs/xxxxxxxxxxxxxx.crt'),
                ca: await fs.readFile('/etc/pki/tls/certs/gd_bundle-g2-g1.crt'),
            },
            app
        )
        .listen(process.env.HTTPS_PORT, () => {
            console.log(`El servidor principal se está ejecutando en: ${process.env.HTTPS_PORT}`);
        })
        .on('error', (err) => {
            console.log(`No se pudo iniciar el servidor principal: ${err}`);
        });
    

    Sin embargo, en lugar de usar el mismo certificado que antes, debes proporcionar la ruta al certificado para el CNAME.

    Por ejemplo, si tu CNAME es web.subdominio2.dominio.com y has obtenido un certificado para él en /etc/pki/tls/certs/web.subdominio2.dominio.com.crt, modificarías el código de arriba a:

    https
        .createServer(
            {
                key: await fs.readFile('/etc/pki/tls/private/key.txt'),
                cert: await fs.readFile('/etc/pki/tls/certs/web.subdominio2.dominio.com.crt'),
                ca: await fs.readFile('/etc/pki/tls/certs/gd_bundle-g2-g1.crt'),
            },
            app
        )
        .listen(process.env.HTTPS_PORT, () => {
            console.log(`El servidor principal se está ejecutando en: ${process.env.HTTPS_PORT}`);
        })
        .on('error', (err) => {
            console.log(`No se pudo iniciar el servidor principal: ${err}`);
        });
    

    Con esta configuración, tu servidor podrá manejar solicitudes SSL tanto para el FQDN del servidor como para el CNAME.

Comments are closed.