Postfix "advertencia: no se puede obtener la clave privada RSA del archivo"

14

Acabo de seguir este tutorial para configurar un servidor de correo postfix con dovecot y mysql como back-end para usuarios virtuales.

Ahora que tengo la mayoría de las piezas funcionando, puedo conectarme a POP3 (S) e IMAP (S).

Utilizando

echo TEST-MAIL | mail [email protected]

funciona bien, cuando inicio sesión en mi cuenta de hotmail muestra el correo electrónico.

También funciona en reversa, por lo tanto, mi entrada MX para example.com finalmente se ha propagado, por lo que puedo recibir correos electrónicos enviados desde [email protected] a [email protected] y verlos en Thunderbird usando STARTTLS a través de IMAP.

Investigando un poco más después de recibir el mensaje de error " 5.7.1: Acceso de retransmisión denegado " al intentar enviar correos a [email protected] usando Thunderbird para iniciar sesión en [email protected] , descubrí que mi servidor estaba actuando como un "Open Mail Relay", que, por supuesto, es algo malo.

Al profundizar más en las partes opcionales del tutorial como este comentario y la otra publicación , decidí completar estos pasos también para poder enviar correos a través de [email protected] a través de Mozilla Thunderbird, sin recibir el mensaje de error " 5.7.1 : Acceso de retransmisión denegado "(ya que los servidores de correo comunes rechazan los correos electrónicos retransmitidos abiertos).

Pero ahora me encontré con un error al intentar que Postfix funcionara con SMTPS, en /var/log/mail.log se lee

Sep 28 17:29:34 domain postfix/smtpd[20251]: warning: cannot get RSA private key from file /etc/ssl/certs/postfix.pem: disabling TLS support
Sep 28 17:29:34 domain postfix/smtpd[20251]: warning: TLS library problem: 20251:error:0906D06C:PEM routines:PEM_read_bio:no start line:pem_lib.c:650:Expecting: ANY PRIVATE KEY:
Sep 28 17:29:34 domain postfix/smtpd[20251]: warning: TLS library problem: 20251:error:140B0009:SSL routines:SSL_CTX_use_PrivateKey_file:PEM lib:ssl_rsa.c:669:

Ese error se registra justo después de intentar enviar un correo desde mi servidor de correo recién instalado usando SMTP SSL / TLS a través del puerto 465 en Thunderbird. Thunderbird luego me dice que ocurrió un tiempo de espera.

Google tiene algunos resultados sobre ese problema, pero no pude hacerlo funcionar con ninguno de ellos. Enlazaría algunos de ellos aquí, pero como usuario nuevo solo puedo usar dos hipervínculos.

Mi /etc/postfix/master.cf se parece a

smtp      inet  n       -       -       -       -       smtpd
smtps     inet  n       -       -       -       -       smtpd
   -o smtpd_tls_wrappermode=yes
   -o smtpd_sasl_auth_enable=yes

y nmap me dice

PORT     STATE SERVICE
[...]
465/tcp  open  smtps
[...]

mi /etc/postfix/main.cf parece

smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
biff = no
append_dot_mydomain = no
readme_directory = no
#smtpd_tls_cert_file = /etc/ssl/certs/postfix.pem            #default postfix generated
#smtpd_tls_key_file = /etc/ssl/private/ssl-cert-snakeoil.key #default postfix generated
smtpd_tls_cert_file = /etc/ssl/certs/postfix.pem
smptd_tls_key_file = /etc/ssl/private/postfix.pem
smtpd_use_tls = yes
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smptd_sasl_auth_enable = yes
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination

myhostname = example.com
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = /etc/mailname
mydestination = localhost.com, localhost
relayhost =
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
virtual_alias_maps = mysql:/etc/postfix/mysql-virtual-alias-maps.cf
virtual_transport = dovecot
dovecot_destination_recipient_limit = 1
mailbox_command = /usr/lib/dovecot/deliver

Los archivos * .pem se crearon como se describe en el tutorial anterior, utilizando

Postfix
To create a certificate to be used by Postfix use:

openssl req -new -x509 -days 3650 -nodes -out /etc/ssl/certs/postfix.pem -keyout /etc/ssl/private/postfix.pem

Do not forget to set the permissions on the private key so that no unauthorized people can read it:

chmod o= /etc/ssl/private/postfix.pem

You will have to tell Postfix where to find your certificate and private key because by default it will look for a dummy certificate file called "ssl-cert-snakeoil":

postconf -e smtpd_tls_cert_file=/etc/ssl/certs/postfix.pem
postconf -e smtpd_tls_key_file=/etc/ssl/private/postfix.pem

Creo que no tengo que incluir /etc/dovecot/dovecot.conf aquí, ya que iniciar sesión a través de imaps y pop3s funciona bien de acuerdo con los registros. El único problema es hacer que Postfix use correctamente los certificados autofirmados y autofirmados.

Cualquier ayuda apreciada!

EDITAR: acabo de probar este tutorial diferente sobre la generación de un certificado autofirmado para postfix, obteniendo el mismo error. Realmente no sé qué más probar.

También verifiqué las bibliotecas SSL, pero todo parece estar bien:

  root@domain:~# ldd /usr/sbin/postfix
    linux-vdso.so.1 =>  (0x00007fff91b25000)
    libpostfix-global.so.1 => /usr/lib/libpostfix-global.so.1 (0x00007f6f8313d000)
    libpostfix-util.so.1 => /usr/lib/libpostfix-util.so.1 (0x00007f6f82f07000)
    libssl.so.0.9.8 => /usr/lib/libssl.so.0.9.8 (0x00007f6f82cb1000)
    libcrypto.so.0.9.8 => /usr/lib/libcrypto.so.0.9.8 (0x00007f6f82910000)
    libsasl2.so.2 => /usr/lib/libsasl2.so.2 (0x00007f6f826f7000)
    libdb-4.8.so => /usr/lib/libdb-4.8.so (0x00007f6f8237c000)
    libnsl.so.1 => /lib/libnsl.so.1 (0x00007f6f82164000)
    libresolv.so.2 => /lib/libresolv.so.2 (0x00007f6f81f4e000)
    libc.so.6 => /lib/libc.so.6 (0x00007f6f81beb000)
    libdl.so.2 => /lib/libdl.so.2 (0x00007f6f819e7000)
    libz.so.1 => /usr/lib/libz.so.1 (0x00007f6f817d0000)
    libpthread.so.0 => /lib/libpthread.so.0 (0x00007f6f815b3000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f6f83581000)

Después de seguir las instrucciones de Ansgar Wiechers , finalmente funciona.

postconf -ncontenía las líneas como debería. La verificación del certificado / clave a través de openssl mostró que ambos archivos son válidos.

¡De hecho, ha sido un problema de permisos! No sabía que la creación de los archivos /etc/ssl/*/postfix.pem para postfix: postfix no es suficiente para que postfix lea los archivos.

Uf
fuente

Respuestas:

16

El contenido de main.cfno necesariamente representa su configuración activa de Postfix. Verifique la salida de postconf -nlos siguientes dos parámetros:

smtpd_recipient_restrictions = 
  permit_mynetworks, 
  permit_sasl_authenticated, 
  reject_unauth_destination
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128

Si $mynetworksestá restringido a localhost y se $smtpd_recipient_restrictionsmuestra permit_mynetworks, permit_sasl_authenticated, reject_unauth_destinationcomo las tres primeras restricciones, entonces no eres un relevo abierto.

Verifique que /etc/ssl/private/postfix.pemcontiene una clave válida y /etc/ssl/certs/postfix.pemcontiene un certificado válido:

openssl rsa -in /etc/ssl/private/postfix.pem -check -noout
openssl x509 -in /etc/ssl/certs/postfix.pem -text -noout

También debe verificar si Postfix puede acceder al archivo. En mi servidor, los permisos /etc/ssl/privateson

drwx--x---  2 root ssl-cert  4096 Aug 03 01:55 private/

Por lo tanto, simplemente chownusar el archivo de clave no le servirá de nada, porque los permisos del directorio evitan que Postfix acceda a cualquier archivo en él.

Intenta simplificar tu configuración. Ponga el certificado y la clave en un solo archivo:

cat /etc/ssl/*/postfix.pem > /etc/postfix/server.pem
chmod 640 /etc/postfix/server.pem
chown postfix:postfix /etc/postfix/server.pem

y cambia tu main.cfasí:

smtpd_tls_cert_file = /etc/postfix/server.pem
smtpd_tls_key_file = $smtpd_tls_cert_file

Reinicie Postfix y vea si el servidor puede acceder a la clave.

Ansgar Wiechers
fuente
Eso lo solucionó, muchas gracias, ambos Ladadadada y Ansgar Wiechers .
phew
Gracias por la postconf -nparte Copiar y pegar dio como resultado un archivo cert y una clave no relacionada, y al centrarme en el resultado de eso, me permitió ver el error tipográfico en el archivo de configuración que ya había verificado pero que me perdí ...
Adam Kerz
2

Esas instrucciones tienen chmod o= /etc/ssl/private/postfix.pempero no dicen nada sobre qué usuario posee el archivo.

En mis cajas, el smtpdproceso se ejecuta como el postfixusuario. Verifique que el postfixusuario pueda acceder /etc/ssl/private/postfix.pem. O posiblemente solo chown postfix:postfix /etc/ssl/private/postfix.pem.

El otro problema obvio es exactamente lo que dice el mensaje de error: no hay una clave RSA válida en ese archivo. Eche un vistazo /etc/ssl/private/postfix.pemy asegúrese de que contenga al menos algo que se parezca a una clave RSA. No lo pegues en tu pregunta.

En realidad, acabo de notar que el mensaje de error es para /etc/ssl/certs/postfix.pem, no /etc/ssl/private/postfix.pem. Verifique también la propiedad, los permisos y el contenido de /etc/ssl/certs/postfix.pem.


Ese mensaje de error es un poco confuso. Dice cannot get RSA private key from file /etc/ssl/certs/postfix.pempero la clave privada debería estar adentro /etc/ssl/private/postfix.pem. No tengo suficiente experiencia con Postfix usando TLS para saber si esto es un error de Postfix o un error en su configuración.

Ladadadada
fuente
Coloqué ambos archivos en postfix: postfix luego reinicié postfix, pero intentar enviar un correo electrónico todavía reproduce el error en /var/log/mail.log
phew
root @ domain: / etc / ssl / certs # ls -l postfix.pem -rw-r - r-- 1 postfix postfix 1363 28 de septiembre 16:36 postfix.pem y parece contener contenido del certificado, comenzando con - --- COMENZAR CERTIFICADO ----- que contiene datos hasta ----- FINALIZAR CERTIFICADO -----
phew
También me preguntaba sobre eso, así que intenté intercambiar los archivos. Pero eso no tiene sentido ya que el archivo en / certs / contiene el encabezado del certificado "---- BEGIN CERTIFICATE -----". Gracias por tu ayuda de todos modos.
phew
0

verifique que la clave no tenga una frase de contraseña. Puedes eliminarlo con

openssl rsa -in key.pem -out newkey.pem

si están juntos usan

openssl rsa -in mycert.pem -out newcert.pem
openssl x509 -in mycert.pem >>newcert.pem

La frase de contraseña emitirá una advertencia en los registros que dice que no pudo obtener la clave privada RSAA, que a su vez deshabilita el soporte TLS. ¡Espero que esto ayude a alguien!

user419756
fuente