bg-tutorials

Cómo generar un CSR en Postfix

Esta guía te muestra cómo generar un CSR (Certificate Signing Request) en Postfix usando la línea de comandos de OpenSSL. Postfix en sí mismo no genera claves ni CSRs; utiliza los archivos que produce OpenSSL y los referencia desde /etc/postfix/main.cf. Ejecutas un único comando que crea dos archivos a la vez: una clave privada que permanece en el servidor y el CSR que envías a tu Autoridad de Certificación (CA).

El CSR codifica el nombre de host que tu MTA presenta en STARTTLS, los datos de tu organización y la mitad pública de la clave. La clave privada correspondiente nunca sale del servidor. Si la pierdes, el certificado emitido queda inutilizable y tienes que empezar de nuevo.

Requisitos previos

  • Acceso root o sudo al servidor que ejecuta Postfix.
  • OpenSSL instalado. Viene incluido en el sistema base de todas las distribuciones principales de Linux; compruébalo con openssl version.
  • El nombre de host de correo completamente calificado que deseas en el certificado, por ejemplo mail.example.com. Este debe coincidir con el registro MX al que se conectan los clientes mediante STARTTLS, no con el dominio raíz sin subdominio.

Paso 1: Prepara un directorio para la clave y el CSR

Mantén el material TLS de Postfix en su propio directorio dentro de /etc/postfix/ para que los permisos sean fáciles de gestionar. Créalo y restríngelo a root:

sudo mkdir -p /etc/postfix/ssl
sudo chmod 700 /etc/postfix/ssl
cd /etc/postfix/ssl

Generarás la clave y el CSR dentro de este directorio, y luego los referenciarás desde main.cf después de que la CA emita el certificado.

Paso 2: Genera la clave privada y el CSR

Ejecuta el siguiente comando. Este crea la clave privada y el CSR en un solo paso e incluye el Subject Alternative Name (SAN) que requieren los navegadores modernos, los clientes de correo y las CAs. El SAN debe incluir el nombre de host de correo (aquel al que apunta tu registro MX), no el dominio raíz sin subdominio:

sudo openssl req -new -newkey rsa:2048 -nodes 
-keyout /etc/postfix/ssl/mail.example.com.key 
-out /etc/postfix/ssl/mail.example.com.csr 
-subj "/C=US/ST=YourState/L=YourCity/O=YourCompany/CN=mail.example.com" 
-addext "subjectAltName=DNS:mail.example.com"

Esto es lo que hace cada parte:

  • req -new crea una nueva solicitud de firma de certificado.
  • -newkey rsa:2048 genera una nueva clave privada RSA de 2048 bits. 2048 bits es el mínimo actual para certificados públicos; puedes usar rsa:4096 para una clave más grande.
  • -nodes deja la clave privada sin cifrar (sin frase de contraseña), de modo que Postfix pueda cargarla al iniciar sin pedir confirmación.
  • -keyout escribe la clave privada. Mantén este archivo privado y nunca lo envíes a nadie, ni siquiera a la CA.
  • -out escribe el CSR que envías a la CA.
  • -subj completa los campos del asunto en línea para que el comando se ejecute sin solicitudes interactivas. Establece CN (Common Name) con tu nombre de host de correo.
  • -addext «subjectAltName=…» añade la entrada SAN. Las CAs emiten según la lista SAN, por lo que el nombre de host de correo debe aparecer aquí.

Sustituye mail.example.com por el nombre de host real al que se conectan los clientes (a menudo el mismo nombre que tu registro MX), y edita los valores de -subj para que coincidan con tu organización. El código de país de dos letras (C) debe estar en mayúsculas, por ejemplo US o GB. Para un certificado validado por dominio (DV), los campos de organización no se verifican, pero el comando de todos modos necesita valores válidos. El OpenSSL moderno firma el CSR con SHA-256 por defecto, que es lo que requiere toda CA pública.

Si prefieres completar los campos de forma interactiva en lugar de usar -subj, elimina esa línea y OpenSSL te pedirá cada valor:

sudo openssl req -new -newkey rsa:2048 -nodes 
-keyout /etc/postfix/ssl/mail.example.com.key 
-out /etc/postfix/ssl/mail.example.com.csr 
-addext "subjectAltName=DNS:mail.example.com"

Cuando se te solicite, deja en blanco la contraseña de desafío y el nombre de empresa opcional pulsando Intro. Las CAs ignoran esos campos, y una contraseña de desafío causa problemas más adelante.

Cubrir más de un nombre de host

Si la misma instancia de Postfix responde en más de un nombre (por ejemplo, tanto mail.example.com como smtp.example.com, o un certificado compartido para correo y webmail), enumera cada nombre de host en el valor SAN, separados por comas:

-addext "subjectAltName=DNS:mail.example.com,DNS:smtp.example.com,DNS:webmail.example.com"

El Common Name debe seguir siendo el nombre de host de correo principal. Añadir el dominio raíz sin subdominio al SAN solo es útil si los clientes de correo llegan a conectarse a él directamente; si tu registro MX apunta a un subdominio, no necesitas el dominio raíz en el certificado.

¿Prefieres una clave ECDSA?

Las claves ECDSA son más pequeñas y rápidas que las RSA con el mismo nivel de seguridad, y son compatibles con todos los clientes de correo y CAs actuales. Para generar en su lugar una clave y un CSR P-256 (prime256v1), cambia el argumento -newkey:

sudo openssl req -new -newkey ec -pkeyopt ec_paramgen_curve:prime256v1 -pkeyopt ec_param_enc:named_curve -nodes 
-keyout /etc/postfix/ssl/mail.example.com.key 
-out /etc/postfix/ssl/mail.example.com.csr 
-subj "/C=US/ST=YourState/L=YourCity/O=YourCompany/CN=mail.example.com" 
-addext "subjectAltName=DNS:mail.example.com"

Paso 3: Protege la clave privada

Restringe la clave privada para que solo root pueda leerla. Postfix abre su material TLS antes de descartar privilegios, por lo que la propiedad de root y el modo 600 son a la vez correctos y necesarios:

sudo chown root:root /etc/postfix/ssl/mail.example.com.key
sudo chmod 600 /etc/postfix/ssl/mail.example.com.key

El archivo CSR no es secreto (contiene solo la clave pública y tus datos de sujeto), pero mantenerlo en el mismo directorio restringido conserva la estructura ordenada.

Paso 4: Verifica el CSR

Antes de enviar la solicitud, confirma que contiene el nombre de host y el SAN correctos, y que su firma es válida. Este comando imprime el contenido decodificado y comprueba la firma localmente:

openssl req -noout -text -verify -in /etc/postfix/ssl/mail.example.com.csr

Busca verify OK en la salida, comprueba que la línea Subject muestre tu nombre de host de correo como Common Name, y confirma que la sección X509v3 Subject Alternative Name enumere cada nombre de host que esperas. Si falta un SAN, vuelve a generar el CSR con el valor correcto de -addext: una CA no puede añadir nombres de host después de la emisión. También puedes pegar el CSR en nuestro CSR Decoder en línea para comprobar estos campos en un navegador.

Paso 5: Envía el CSR

Abre el archivo CSR y copia todo su contenido, incluidas las líneas BEGIN y END:

cat /etc/postfix/ssl/mail.example.com.csr

El bloque se ve así. Copia todo desde la primera línea hasta la última, incluyendo los cinco guiones a cada lado de los marcadores BEGIN y END:

-----BEGIN CERTIFICATE REQUEST-----
MIIC...base64-encoded data...AB
-----END CERTIFICATE REQUEST-----

Pega ese bloque en tu formulario de pedido SSL. Después de que la CA valide el CSR y emita el certificado, sigue nuestras instrucciones de instalación de SSL para Postfix para implementarlo. Conserva el archivo .key en el servidor: lo necesitas junto con el certificado emitido para servir STARTTLS, y nunca debes enviarlo a la CA ni a nadie más.

Si prefieres no usar la línea de comandos, crea la solicitud con nuestro CSR Generator y pega el resultado en tu pedido. El generador devuelve una clave privada correspondiente que colocas en la misma ruta en el servidor.

Dónde van los archivos en Postfix

Como contexto, así es como los archivos que acabas de generar se conectan a Postfix una vez que la CA devuelve el certificado y el intermedio (paquete de CA). En Postfix 3.4 y versiones posteriores, la forma recomendada de directiva única toma un archivo PEM que contiene la clave privada seguida de la cadena de certificados completa:

cat mail.example.com.key mail.example.com.crt intermediate.pem 
> /etc/postfix/ssl/mail.example.com.chain.pem
sudo chmod 600 /etc/postfix/ssl/mail.example.com.chain.pem

Luego, en /etc/postfix/main.cf:

smtpd_tls_chain_files = /etc/postfix/ssl/mail.example.com.chain.pem
smtpd_tls_security_level = may

En versiones de Postfix anteriores a la 3.4, utiliza el par de directivas antiguo, con la clave y un certificado de cadena completa guardados en archivos separados:

smtpd_tls_cert_file = /etc/postfix/ssl/mail.example.com.fullchain.crt
smtpd_tls_key_file  = /etc/postfix/ssl/mail.example.com.key
smtpd_tls_security_level = may

La guía completa de instalación, incluyendo el servicio de envío en el puerto 587 y la verificación con OpenSSL, está disponible en nuestra guía de instalación de SSL para Postfix.

Genera un CSR en otras plataformas de correo

¿Utilizas un servidor de correo o una pasarela diferente? Consulta nuestras otras guías de CSR:

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.