bg-tutorials

Cómo instalar un certificado SSL en Qmail

Este tutorial te muestra cómo instalar un certificado SSL/TLS en Qmail, el agente de transferencia de correo escrito originalmente por D. J. Bernstein. El proceso es el mismo que Qmail ha usado durante años: crear un único archivo PEM que contenga la clave privada, tu certificado de servidor y la cadena intermedia, colocarlo en /var/qmail/control/servercert.pem, y reiniciar Qmail.

Antes de empezar: Qmail es un MTA heredado (legacy)

Qmail en sí no se ha actualizado desde el lanzamiento original de qmail-1.03 en 1998. D. J. Bernstein puso el código en el dominio público en 2007, pero no retomó el desarrollo. El conocido fork de la comunidad netqmail alcanzó su última versión, la 1.06, en 2007 y lleva más de una década sin mantenimiento. El sucesor moderno activo es notqmail (versión actual 1.09, mayo de 2024), que incorpora correcciones de errores y compatibilidad con sistemas modernos, manteniéndose compatible como reemplazo directo del original.

Igual de importante para esta guía: qmail de fábrica no tiene soporte nativo para SSL/TLS. TLS se añade mediante una de dos vías de terceros:

  • El parche qmail-tls de Frederik Vermeulen, que añade STARTTLS a qmail-smtpd y lee el certificado desde una ruta fija: /var/qmail/control/servercert.pem. La mayoría de los paquetes modernos de qmail (incluidas las compilaciones de netqmail y notqmail, la distribución s/qmail y muchos paquetes de proveedores) incluyen este parche o uno equivalente.
  • stunnel delante de qmail-smtpd para envolver la conexión en TLS en el puerto 465 (SMTPS). Esto funciona con cualquier compilación de qmail porque la terminación TLS ocurre fuera de Qmail.

Si mantienes una implementación de qmail existente, los pasos siguientes siguen siendo válidos. Si estás construyendo un nuevo servidor de correo desde cero, considera usar Postfix u OpenSMTPD en su lugar: ambos cuentan con soporte TLS nativo y bien mantenido, además de equipos de seguridad activos. Tenemos un tutorial aparte sobre cómo instalar un certificado SSL en Postfix.

Generar un código CSR para Qmail

Si ya generaste tu CSR y recibiste los archivos SSL de tu CA, salta directamente a Instalar el certificado SSL en Qmail.

CSR son las siglas de Certificate Signing Request (solicitud de firma de certificado): un bloque de texto codificado que contiene los datos de tu dominio y organización. Lo envías a la Autoridad de Certificación (CA) para que pueda validar tu solicitud y emitir el certificado. Generar el CSR también crea la clave privada correspondiente, que permanece en tu servidor y es necesaria para la instalación. Tienes dos opciones:

Abre el archivo CSR en cualquier editor de texto plano y copia todo el bloque, incluidas las líneas BEGIN CERTIFICATE REQUEST y END CERTIFICATE REQUEST, en el campo CSR de tu formulario de pedido. Guarda el archivo de la clave privada en un lugar seguro: lo combinarás en el archivo PEM en la siguiente sección.

Instalar el certificado SSL en Qmail

Después de la validación, la CA te envía por correo electrónico un archivo ZIP con tus archivos SSL: el certificado principal (de servidor) y uno o más certificados intermedios (de la CA). Extrae el archivo en tu servidor y sigue los pasos a continuación.

Paso 1: Combina la clave, el certificado y la cadena en un solo archivo PEM

El parche qmail-tls (y los equivalentes en netqmail, notqmail y s/qmail) lee todo lo que necesita para terminar TLS desde un único archivo PEM. Concatena los archivos en este orden: primero tu clave privada, luego tu certificado de servidor, y después la cadena intermedia (CA). El certificado raíz no es necesario (los clientes ya confían en él). Desde el directorio que contiene tus archivos extraídos, ejecuta:

cat yourdomain.key yourdomain.crt yourdomain.ca-bundle > servercert.pem

Si tu CA entregó los intermedios como archivos separados en lugar de un único .ca-bundle, enumera cada uno después del certificado de servidor, primero el hoja y al final el intermedio que emite hacia la raíz:

cat yourdomain.key yourdomain.crt intermediate1.crt intermediate2.crt > servercert.pem

Abre el archivo resultante en un editor de texto para confirmar la estructura. Debería verse así, con los marcadores reales de cinco guiones alrededor de cada bloque:

-----BEGIN RSA PRIVATE KEY-----
(the text of your private key)
-----END RSA PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
(the text of your primary SSL certificate)
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
(the text of the intermediate CA certificate)
-----END CERTIFICATE-----

Las claves más recientes pueden llevar la etiqueta BEGIN PRIVATE KEY en lugar de BEGIN RSA PRIVATE KEY; ambas son válidas. La clave no debe estar cifrada con una contraseña, porque qmail-smtpd la carga al iniciar sin pedir confirmación. Si tu CA emitió un certificado ECDSA, el bloque de la clave será BEGIN EC PRIVATE KEY; nada más cambia.

Paso 2: Mueve el archivo al directorio de control de Qmail

El nombre y la ruta del archivo están fijados por el parche qmail-tls. Mueve el PEM combinado al directorio de control de Qmail y restringe sus permisos, ya que contiene tu clave privada:

sudo mv servercert.pem /var/qmail/control/servercert.pem
sudo chmod 600 /var/qmail/control/servercert.pem
sudo chown root:qmail /var/qmail/control/servercert.pem

El propietario y el grupo dependen de qué usuario ejecuta qmail-smtpd en tu sistema. En una instalación estándar de netqmail o notqmail, suele ser qmaild o el grupo qmail, por lo que root:qmail con el modo 600 funciona. En una configuración basada en vpopmail, qmail-smtpd se ejecuta como vpopmail, así que usa:

sudo chown vpopmail:vchkpw /var/qmail/control/servercert.pem
sudo chmod 640 /var/qmail/control/servercert.pem

En cualquier caso, el objetivo es el mismo: el proceso qmail-smtpd debe poder leer el archivo, y ningún otro proceso debería poder hacerlo.

Paso 3: Ajusta para compilaciones personalizadas

La mayoría de las variantes de qmail buscan en la ubicación predeterminada, pero algunas usan variables de entorno en su lugar. Identifica tu compilación:

  • Qmail estándar con el parche qmail-tls (netqmail / notqmail / paquetes de proveedores): no se necesita configuración adicional. qmail-smtpd lee automáticamente /var/qmail/control/servercert.pem. Para que qmail-smtpd anuncie STARTTLS en la respuesta EHLO, la variable de entorno UCSPITLS debe estar establecida en el script de ejecución de qmail-smtpd (típicamente /var/qmail/supervise/qmail-smtpd/run): exporta UCSPITLS=»» antes de la línea de qmail-smtpd. Para exigir el cifrado antes de la autenticación, también establece FORCE_TLS=1.
  • s/qmail con ucspi-ssl: la ruta del certificado no está fijada. Establece estas variables de entorno en el script de ejecución de qmail-smtpd (o en el envoltorio correspondiente de tcpserver / sslserver): CERTFILE para el certificado de servidor, KEYFILE para la clave privada (ambas pueden apuntar al mismo PEM combinado), y CERTCHAINFILE para los intermedios. Consulta la documentación de s/qmail para conocer los nombres exactos de las directivas en tu versión.
  • Frontal con stunnel (SMTPS en el puerto 465): apunta la directiva cert de stunnel a /var/qmail/control/servercert.pem y haz que su exec inicie qmail-smtpd. Esta vía no necesita el parche qmail-tls en absoluto; TLS termina en stunnel.

Si no sabes con qué parche se compiló tu qmail-smtpd, revisa el binario:

strings /var/qmail/bin/qmail-smtpd | grep -iE 'tls|starttls|servercert'

Si ves referencias a STARTTLS, servercert.pem o UCSPITLS, el binario tiene compilado el parche qmail-tls.

Paso 4: Reinicia Qmail

Qmail lee el certificado al iniciar el proceso, por lo que es necesario reiniciar qmail-smtpd. En la mayoría de las instalaciones que usan los scripts de control incluidos:

sudo qmailctl restart

Si tu distribución envuelve Qmail en un servicio systemd, usa:

sudo systemctl restart qmail

En una configuración de daemontools / runit, envía a qmail-smtpd una señal TERM a través de svc en su lugar:

sudo svc -t /service/qmail-smtpd

Vigila el registro (típicamente /var/log/qmail/smtpd/current) en busca de errores durante el arranque. Un PEM mal formado o una propiedad incorrecta es la razón más común por la que qmail-smtpd se niega a habilitar TLS.

Prueba tu instalación SSL

Confirma que Qmail ofrece STARTTLS y sirve el certificado correcto con OpenSSL. Reemplaza mail.yourdomain.com con el nombre de host de tu servidor de correo:

openssl s_client -starttls smtp -connect mail.yourdomain.com:25 -servername mail.yourdomain.com </dev/null 
| openssl x509 -noout -issuer -subject -dates

La salida debería mostrar el sujeto (nombre común) de tu certificado, el emisor (la CA) y las fechas de validez. Si configuraste SMTPS mediante stunnel en el puerto 465 en su lugar, elimina -starttls smtp y conéctate directamente al puerto 465:

openssl s_client -connect mail.yourdomain.com:465 -servername mail.yourdomain.com

Busca Verify return code: 0 (ok) al final del intercambio de conexión (handshake). Si ves un error de cadena, faltan los certificados intermedios en servercert.pem: añádelos y reinicia qmail-smtpd. Para obtener un informe completo sobre el certificado, la cadena y el soporte de protocolos, ejecuta nuestro SSL Checker contra el nombre de host de tu servidor de correo.

Preguntas Frecuentes

¿De dónde lee Qmail el certificado SSL?

Del archivo /var/qmail/control/servercert.pem. Esa ruta está fijada en el parche qmail-tls que añade STARTTLS a qmail-smtpd, y la misma ruta se usa en todas las variantes comunes de qmail (netqmail, notqmail, paquetes de proveedores). El archivo debe contener la clave privada, el certificado de servidor y la cadena intermedia, en ese orden. s/qmail con ucspi-ssl es la excepción: en su lugar lee las variables de entorno CERTFILE, KEYFILE y CERTCHAINFILE.

¿En qué orden coloco los archivos en servercert.pem?

Primero la clave privada, luego el certificado de servidor (hoja) y después el o los certificados intermedios de la CA. El certificado raíz no es necesario, porque los clientes de correo ya confían en él. Una compilación de una sola línea es suficiente:
cat yourdomain.key yourdomain.crt yourdomain.ca-bundle > servercert.pem
Si el orden es incorrecto, qmail-smtpd no podrá cargar el certificado al iniciar y no se ofrecerá TLS. Revisa el registro en /var/log/qmail/smtpd/ si sospechas de esto.

¿Qmail de fábrica soporta TLS?

No por sí solo. El lanzamiento original de qmail-1.03 de 1998 no tiene soporte para SSL o TLS. TLS se añade mediante el parche qmail-tls (compilado dentro del binario qmail-smtpd, añade STARTTLS en los puertos 25 y 587) o ejecutando stunnel delante de qmail-smtpd para SMTPS en el puerto 465. Casi todos los paquetes modernos de qmail incluyen el parche qmail-tls ya aplicado, por lo que normalmente no necesitas parchear el código fuente tú mismo.

¿Sigue manteniéndose Qmail?

El Qmail original (qmail-1.03) no se ha actualizado desde 1998. El primer fork de la comunidad, netqmail, lanzó su última versión (1.06) en 2007. El sucesor moderno activo es notqmail, que lanzó la versión 1.09 en mayo de 2024 y sigue publicando correcciones de errores y parches de compatibilidad con sistemas modernos. Para nuevos servidores de correo, la mayoría de los operadores eligen Postfix u OpenSMTPD en su lugar, ambos con soporte TLS nativo y activamente mantenido.

¿Por qué qmail-smtpd se inicia pero no ofrece STARTTLS?

Tres causas comunes. Primero, la variable de entorno UCSPITLS no está exportada en el script de ejecución de qmail-smtpd: establece UCSPITLS=»» (el valor puede estar vacío) antes de la línea de qmail-smtpd y reinicia el servicio. Segundo, el binario qmail-smtpd se compiló sin el parche qmail-tls: confírmalo con strings /var/qmail/bin/qmail-smtpd | grep -i tls. Tercero, /var/qmail/control/servercert.pem falta, no puede leerlo el usuario de qmail-smtpd, o está mal formado; revisa los permisos y el orden de los bloques PEM.

¿Cómo verifico el certificado después de reiniciar Qmail?

Conéctate al puerto SMTP con OpenSSL y lee el certificado que Qmail presenta a través de STARTTLS:
openssl s_client -starttls smtp -connect mail.yourdomain.com:25 -servername mail.yourdomain.com </dev/null | openssl x509 -noout -issuer -subject -dates
Esto muestra el sujeto, el emisor y las fechas de validez. Para SMTPS mediante stunnel en el puerto 465, elimina la opción -starttls smtp. Confirma que el emisor coincida con tu CA y que el intercambio de conexión termine con Verify return code: 0 (ok).

Ahorre un 10% en certificados SSL al realizar su pedido hoy mismo.

Emisión rápida, cifrado potente, 99,99% de confianza del navegador, asistencia dedicada y garantía de devolución del dinero en 25 días. Código del cupón: SAVE10

Una imagen detallada de un dragón en vuelo
Escrito por

Redactor de contenidos experimentado especializado en Certificados SSL. Transformar temas complejos de ciberseguridad en contenido claro y atractivo. Contribuir a mejorar la seguridad digital a través de narrativas impactantes.