Postfix „ostrzeżenie: nie można uzyskać klucza prywatnego RSA z pliku”

14

Właśnie wykonałem ten samouczek, aby skonfigurować serwer pocztowy z poprawkami dovecot i mysql jako backend dla użytkowników wirtualnych.

Teraz większość części działa, mogę połączyć się z POP3 (S) i IMAP (S).

Za pomocą

echo TEST-MAIL | mail [email protected]

działa dobrze, gdy zaloguję się na swoje konto Hotmail, wyświetla wiadomość e-mail.

Działa również w odwrotnej kolejności, dlatego mój wpis MX dla example.com w końcu został rozpowszechniony, więc jestem w stanie odbierać wiadomości e-mail wysyłane z [email protected] na [email protected] i przeglądać je w Thunderbird za pomocą STARTTLS za pośrednictwem IMAP.

Robiąc trochę więcej badań po otrzymaniu komunikatu o błędzie „ 5.7.1: Odmowa dostępu do przekaźnika ” podczas próby wysłania wiadomości e-mail na [email protected] przy użyciu Thunderbirda zalogowanego na [email protected] , zorientowałem się, że mój serwer działa jako „Open Mail Relay”, co - oczywiście - jest złą rzeczą.

Zagłębiając się w opcjonalne części samouczka, takie jak ten komentarz i inne turorial , postanowiłem wykonać te kroki, aby móc wysyłać wiadomości e-mail za pośrednictwem [email protected] przez Mozilla Thunderbird, nie otrzymując komunikatu o błędzie „ 5.7.1 : Odmowa dostępu do przekazywania dalej ”(ponieważ zwykłe serwery pocztowe odrzucają otwarte wiadomości e-mail przekazywane).

Ale teraz napotkałem błąd, próbując uzyskać postfiks pracujący z SMTPS, w /var/log/mail.log czyta

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:

Ten błąd jest rejestrowany zaraz po próbie wysłania wiadomości e-mail z mojego nowo zainstalowanego serwera pocztowego za pomocą SMTP SSL / TLS przez port 465 w Thunderbird. Thunderbird mówi mi, że upłynął limit czasu.

Google ma kilka wyników dotyczących tego problemu, ale nie mogłem go uruchomić z żadnym z nich. Chciałbym tutaj linkować niektóre z nich, ale jako nowy użytkownik mogę używać tylko dwóch hiperłączy.

Mój plik /etc/postfix/master.cf wygląda

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

i nmap mówi mi

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

wygląda mój /etc/postfix/main.cf

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

Pliki * .pem zostały utworzone zgodnie z opisem w powyższym samouczku przy użyciu

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

Myślę, że nie muszę tutaj włączać /etc/dovecot/dovecot.conf , ponieważ logowanie za pomocą imaps i pop3s działa poprawnie zgodnie z logami. Jedynym problemem jest prawidłowe używanie przez Postfiksa samodzielnie wygenerowanych certyfikatów z podpisem własnym.

Każda pomoc doceniona!

EDYCJA: Właśnie próbowałem tego innego samouczka na temat generowania samopodpisanego certyfikatu dla Postfiksa, wciąż otrzymując ten sam błąd. Naprawdę nie wiem, co jeszcze przetestować.

Sprawdziłem również biblioteki SSL, ale wszystko wydaje się w porządku:

  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)

Po wykonaniu instrukcji Ansgar Wiechers wreszcie działa.

postconf -nzawierał wiersze tak, jak powinien. Sprawdzanie certyfikatu / klucza przez openssl wykazało, że oba pliki są prawidłowe.

To rzeczywiście był problem z uprawnieniami! Nie wiedziałem, że chown'owanie plików /etc/ssl/*/postfix.pem do postfix: postfix nie wystarczy, aby postfix mógł odczytać pliki.

uff
źródło

Odpowiedzi:

16

Treść main.cfniekoniecznie reprezentuje twoją aktywną konfigurację Postfix. Sprawdź dane wyjściowe postconf -ndla następujących dwóch parametrów:

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

Jeśli $mynetworksjest ograniczony do localhost i $smtpd_recipient_restrictionspokazuje się permit_mynetworks, permit_sasl_authenticated, reject_unauth_destinationjako pierwsze trzy ograniczenia, oznacza to, że nie jesteś otwartym przekaźnikiem.

Sprawdź, czy /etc/ssl/private/postfix.pemzawiera prawidłowy klucz i /etc/ssl/certs/postfix.pemważny certyfikat:

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

Musisz także sprawdzić, czy Postfix może uzyskać dostęp do pliku. Na moim serwerze uprawnienia /etc/ssl/private

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

W ten sposób po prostu chownskopiowanie pliku klucza nic ci nie da, ponieważ uprawnienia do katalogu uniemożliwiają Postfixowi dostęp do dowolnego pliku w nim zawartego.

Spróbuj uprościć konfigurację. Umieść certyfikat i klucz w jednym pliku:

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

i zmień swój w main.cften sposób:

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

Uruchom ponownie Postfix i sprawdź, czy serwer może uzyskać dostęp do klucza.

Ansgar Wiechers
źródło
Naprawiłem to, dziękuję bardzo, oboje, Ladadadada i Ansgar Wiechers .
uff
Dzięki za postconf -nczęść. Skopiowanie i wklejenie skutkowało jednym plikiem cert i niepowiązanym kluczem. Skoncentrowanie się na danych wyjściowych pozwoliło mi zobaczyć literówkę w pliku konfiguracyjnym, który już sprawdziłem, ale nie zauważyłem ...
Adam Kerz
2

Te instrukcje nie chmod o= /etc/ssl/private/postfix.pemmówią nic o tym, który użytkownik jest właścicielem pliku.

Na moich urządzeniach smtpdproces działa jako postfixużytkownik. Sprawdź, czy postfixużytkownik może uzyskać dostęp /etc/ssl/private/postfix.pem. A może po prostu chown postfix:postfix /etc/ssl/private/postfix.pem.

Innym oczywistym problemem jest dokładnie to, co mówi komunikat o błędzie: W tym pliku nie ma prawidłowego klucza RSA. Zajrzyj /etc/ssl/private/postfix.pemi upewnij się, że zawiera przynajmniej coś, co wygląda jak klucz RSA. Nie wklejaj go do swojego pytania.

Właściwie właśnie zauważyłem, że komunikat o błędzie jest przeznaczony do /etc/ssl/certs/postfix.pem, nie /etc/ssl/private/postfix.pem. Sprawdź także własność, uprawnienia i treść /etc/ssl/certs/postfix.pem.


Ten komunikat o błędzie jest trochę mylący. Mówi, cannot get RSA private key from file /etc/ssl/certs/postfix.pemale klucz prywatny powinien być /etc/ssl/private/postfix.pem. Nie mam wystarczającego doświadczenia z Postfixem używającym TLS, aby wiedzieć, czy jest to błąd Postfix, czy błąd w konfiguracji.

Ladadadada
źródło
Zmieniłem oba pliki na postfix: postfix następnie uruchomiłem ponownie postfix, ale próba wysłania wiadomości e-mail wciąż odtwarza błąd w pliku /var/log/mail.log
uff
root @ domain: / etc / ssl / certs # ls -l postfix.pem -rw-r - r-- 1 postfix postfix 1363 28 września 16:36 postfix.pem i wydaje się, że zawiera treść certyfikatu, zaczynając od - --- ROZPOCZNIJ CERTYFIKAT ----- zawierający dane do ----- KOŃCOWY CERTYFIKAT -----
uff
Też się nad tym zastanawiałem, więc spróbowałem zamienić pliki. Ale to nie ma sensu, ponieważ plik w / certs / zawiera nagłówek certyfikatu „---- BEGIN CERTIFICATE -----”. W każdym razie dziękuję za pomoc.
uff
1

Cert musi pasować do klucza, w moim przypadku nie miał nic wspólnego z uprawnieniami

utwórz samopodpisany certyfikat i klucz https://msol.io/blog/tech/create-a-self-signed-ssl-certificate-with-openssl/

Mam nadzieję że to pomoże

użytkownik397245
źródło
Czy nie byłoby lepiej użyć darmowego certyfikatu do szyfrowania?
pisklęta
Doh, dzięki! Skopiuj i wklej otrzymało jeden plik certyfikatu i niepowiązany klucz.
Adam Kerz
0

sprawdź, czy klucz nie ma hasła. Możesz go usunąć za pomocą

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

jeśli są razem, użyj

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

Hasło wyśle ​​ostrzeżenie do dzienników, że nie jest w stanie uzyskać klucza prywatnego RSAA, co z kolei wyłącza obsługę TLS. Mam nadzieję, że to komuś pomoże!

użytkownik419756
źródło