Postfix "avviso: impossibile ottenere la chiave privata RSA dal file"


14

Ho appena seguito questo tutorial per configurare un mailserver postfix con dovecot e mysql come backend per utenti virtuali.

Ora ho funzionato la maggior parte delle parti, posso collegarmi a POP3 (S) e IMAP (S).

utilizzando

echo TEST-MAIL | mail myaccount@hotmail.com

funziona bene, quando accedo al mio account hotmail mostra l'e-mail.

Funziona anche al contrario, quindi la mia voce MX per esempio.com è stata finalmente propagata, quindi sono in grado di ricevere e-mail inviate da myaccount@hotmail.com a myvirtualuser@example.com e visualizzarle in Thunderbird usando STARTTLS tramite IMAP.

Facendo un po 'più di ricerca dopo che ho ricevuto il messaggio di errore " 5.7.1: Accesso di inoltro negato " quando ho provato a inviare mail a mioaccount@hotmail.com usando Thunderbird che si accedeva a myvirtualuser@example.com , ho capito che il mio server stava funzionando come "Open Mail Relay", che - ovviamente - è una cosa negativa.

Scavando di più nelle parti opzionali del tutorial come questo commento e l'altro tutorial , ho deciso di completare anche questi passaggi per essere in grado di inviare mail via myvirtualuser@example.com tramite Mozilla Thunderbird, senza ricevere il messaggio di errore " 5.7.1 : Accesso di inoltro negato "(poiché i comuni server di posta rifiutano le email di inoltro aperte).

Ma ora ho riscontrato un errore nel tentativo di far funzionare Postfix con SMTPS, in /var/log/mail.log si legge

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:

Tale errore viene registrato subito dopo aver tentato di inviare una posta dal mio mailserver appena installato utilizzando SMTP SSL / TLS tramite la porta 465 in Thunderbird. Thunderbird mi dice quindi che si è verificato un timeout.

Google ha alcuni risultati relativi a quel problema, ma non sono riuscito a farlo funzionare con nessuno di questi. Vorrei collegarne alcuni qui, ma come nuovo utente mi è permesso utilizzare solo due collegamenti ipertestuali.

Il mio /etc/postfix/master.cf sembra

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

e nmap mi dice

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

il mio /etc/postfix/main.cf sembra

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

I file * .pem sono stati creati come descritto nel tutorial sopra, usando

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

Penso di non dover includere /etc/dovecot/dovecot.conf qui, poiché l'accesso tramite imaps e pop3s funziona bene secondo i registri. L'unico problema è che Postfix utilizza correttamente i certificati auto-generati e autofirmati.

Qualsiasi aiuto apprezzato!

EDIT: ho appena provato questo diverso tutorial sulla generazione di un certificato autofirmato per Postfix, ottenendo comunque lo stesso errore. Davvero non so cos'altro testare.

Ho anche controllato le librerie SSL, ma tutto sembra andare bene:

  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)

Dopo aver seguito Ansgar Wiechers istruzioni di , finalmente funziona.

postconf -nconteneva le righe come dovrebbe. Il controllo certificato / chiave tramite openssl ha mostrato che entrambi i file sono validi.

Quindi è stato davvero un problema con le autorizzazioni! Non sapevo che chown'ing i file /etc/ssl/*/postfix.pem per postfix: postfix non è sufficiente per postfix per leggere i file.

Risposte:


16

Il contenuto di main.cfnon rappresenta necessariamente la tua configurazione Postfix attiva. Controllare l'output di postconf -nper i seguenti due parametri:

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

Se $mynetworksè limitato a localhost e $smtpd_recipient_restrictionsspettacolipermit_mynetworks, permit_sasl_authenticated, reject_unauth_destination come i primi tre limiti, allora non sei un relay aperto.

Verifica che /etc/ssl/private/postfix.pemcontenga una chiave valida e /etc/ssl/certs/postfix.pemcontenga un certificato valido:

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

È inoltre necessario verificare se Postfix può accedere al file. Sul mio server, le autorizzazioni /etc/ssl/privatesono

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

Pertanto, il semplice chowninserimento del file chiave non ti gioverà, perché le autorizzazioni della directory impediscono a Postfix di accedere a qualsiasi file al suo interno.

Prova a semplificare la configurazione. Inserisci certificato e chiave in un singolo file:

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

e cambia il tuo in main.cfquesto modo:

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

Riavvia Postfix e verifica se il server può accedere alla chiave.


Ciò l'ha risolto, grazie mille, a tutti e due Ladadadada e Ansgar Wiechers .
uff

Grazie per la postconf -nparte Copia e incolla ha provocato un file cert e una chiave non correlata e concentrandomi sull'output di questo mi ha fatto vedere l'errore di battitura nel file di configurazione che avevo già controllato ma che avevo perso ...
Adam Kerz,

2

Quelle istruzioni hanno chmod o= /etc/ssl/private/postfix.pemma non dicono nulla su quale utente possiede il file.

Sulle mie scatole, il smtpdprocesso viene eseguito come postfixutente. Verifica che l' postfixutente possa accedere /etc/ssl/private/postfix.pem. O forse solo chown postfix:postfix /etc/ssl/private/postfix.pem.

L'altro ovvio problema è esattamente ciò che dice il messaggio di errore: non esiste una chiave RSA valida in quel file. Dai un'occhiata /etc/ssl/private/postfix.peme assicurati che contenga almeno qualcosa che assomigli a una chiave RSA. Non incollarlo nella tua domanda.

In realtà, ho appena notato che il messaggio di errore è per /etc/ssl/certs/postfix.pem, non /etc/ssl/private/postfix.pem. Controlla anche la proprietà, le autorizzazioni e il contenuto /etc/ssl/certs/postfix.pem.


Quel messaggio di errore è un po 'confuso. Dice cannot get RSA private key from file /etc/ssl/certs/postfix.pemma la chiave privata dovrebbe essere dentro /etc/ssl/private/postfix.pem. Non ho abbastanza esperienza con Postfix nell'uso di TLS per sapere se si tratta di un bug Postfix o di un errore nella configurazione.


Ho inserito entrambi i file in postfix: postfix quindi riavviato postfix, ma il tentativo di inviare un'e-mail sta ancora riproducendo l'errore in /var/log/mail.log
phew,

root @ domain: / etc / ssl / certs # ls -l postfix.pem -rw-r - r-- 1 postfix postfix 1363 28 settembre 16:36 postfix.pem e sembra contenere contenuto del certificato, a partire da - --- INIZIA CERTIFICATO ----- contenente dati fino a ----- FINE CERTIFICATO -----
phew

Mi stavo chiedendo anche questo, quindi ho provato a scambiare i file. Ma questo non ha senso poiché il file in / certs / contiene l'intestazione del certificato "---- INIZIA CERTIFICATO -----". Grazie per l'aiuto comunque.
phew,


0

controlla che la chiave non abbia una passphrase su di essa. Puoi rimuoverlo con

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

se sono insieme usano

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

La passphrase emetterà un avviso sui log dicendo che non è stato in grado di ottenere la chiave privata RSAA, che a sua volta disabilita il supporto TLS. Spero che questo aiuti qualcuno!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.