Постфикс «предупреждение: не удается получить закрытый ключ RSA из файла»

14

Я просто следовал этому руководству, чтобы настроить почтовый сервер postfix с dovecot и mysql в качестве бэкенда для виртуальных пользователей.

Теперь у меня работает большая часть деталей, я могу подключиться к POP3 (S) и IMAP (S).

С помощью

echo TEST-MAIL | mail myaccount@hotmail.com

работает нормально, когда я захожу в свою учетную запись hotmail, она показывает электронную почту.

Он также работает в обратном порядке, поэтому моя запись MX для example.com, наконец, была распространена, поэтому я могу получать электронные письма, отправленные с myaccount@hotmail.com на myvirtualuser@example.com, и просматривать их в Thunderbird с помощью STARTTLS через IMAP.

Проведя небольшое исследование после того, как я получил сообщение об ошибке « 5.7.1: доступ к ретрансляции запрещен » при попытке отправить почту на myaccount@hotmail.com с использованием входа в Thunderbird на myvirtualuser@example.com , я обнаружил, что мой сервер работает как "Открытая ретрансляция почты", что, конечно, плохо.

Копаясь в дополнительных частях учебника, таких как этот комментарий и другой турориал , я решил также выполнить эти шаги, чтобы иметь возможность отправлять письма через myvirtualuser@example.com через Mozilla Thunderbird, не получая сообщение об ошибке " 5.7.1 : «Доступ к ретрансляции запрещен » больше (поскольку обычные почтовые серверы отклоняют открытые ретранслированные сообщения).

Но теперь я столкнулся с ошибкой, пытаясь заставить postfix работать с SMTPS, в /var/log/mail.log он читает

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:

Эта ошибка регистрируется сразу после того, как я пытаюсь отправить почту с моего недавно установленного почтового сервера, используя SMTP SSL / TLS через порт 465 в Thunderbird. Затем Thunderbird сообщает мне, что истекло время ожидания.

У Google есть несколько результатов, касающихся этой проблемы, но я не смог заставить ее работать ни с одним из них. Я бы связал некоторые из них здесь, но как новый пользователь мне разрешено использовать только две гиперссылки.

Мой /etc/postfix/master.cf выглядит так

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

и Nmap говорит мне

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

мой /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

Файлы * .pem были созданы, как описано в руководстве выше, используя

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

Я думаю, что мне не нужно включать /etc/dovecot/dovecot.conf здесь, так как вход в систему через imaps и pop3s работает нормально в соответствии с журналами. Единственная проблема - заставить postfix правильно использовать самогенерируемые, самозаверяющие сертификаты.

Любая помощь приветствуется!

РЕДАКТИРОВАТЬ: я только что попробовал этот другой учебник по созданию самозаверяющего сертификата для postfix, все еще получая ту же ошибку. Я действительно не знаю, что еще проверить.

Я также проверил библиотеки SSL, но все, кажется, хорошо:

  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)

После следования инструкциям Ансгара Вичерса, он наконец работает.

postconf -nсодержал строки как надо. Проверка сертификата / ключа через openssl действительно показала, что оба файла действительны.

Так что это действительно была проблема с разрешениями! Не знал, что добавление файлов /etc/ssl/*/postfix.pem в постфикс: postfix недостаточно для постфикса, чтобы прочитать файлы.

фу
источник

Ответы:

16

Содержимое main.cfне обязательно отражает вашу активную конфигурацию Postfix. Проверьте выходные данные postconf -nдля следующих двух параметров:

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

Если $mynetworksон ограничен локальным хостом и $smtpd_recipient_restrictionsотображается permit_mynetworks, permit_sasl_authenticated, reject_unauth_destinationкак первые три ограничения, то вы не являетесь открытым ретранслятором.

Убедитесь, что /etc/ssl/private/postfix.pemсодержит действительный ключ и /etc/ssl/certs/postfix.pemсодержит действительный сертификат:

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

Вам также необходимо проверить, может ли Postfix получить доступ к файлу. На моем сервере, разрешения на /etc/ssl/privateэто

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

Таким образом, простое chownиспользование файла ключа не принесет вам никакой пользы, поскольку права доступа к каталогу не позволяют Postfix получить доступ к любому файлу в нем.

Попробуйте упростить настройку. Поместите сертификат и ключ в один файл:

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

и измените свой main.cfтак:

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

Перезапустите Postfix и посмотрите, может ли сервер получить доступ к ключу.

Ансгар Вичерс
источник
Это исправило, большое спасибо вам обоим, Лададададе и Ансгару Вичерсу .
уф
Спасибо за postconf -nчасть. В результате копирования и вставки был получен один файл сертификата и несвязанный ключ, и я сосредоточился на выводе, который позволил мне увидеть опечатку в файле конфигурации, который я уже проверил, но пропустил ...
Адам
2

В этих инструкциях chmod o= /etc/ssl/private/postfix.pemничего не сказано о том, кому принадлежит файл.

На моих коробках smtpdпроцесс запускается от имени postfixпользователя. Убедитесь, что postfixпользователь может получить доступ /etc/ssl/private/postfix.pem. Или, возможно, просто chown postfix:postfix /etc/ssl/private/postfix.pem.

Другая очевидная проблема заключается именно в том, что говорится в сообщении об ошибке: в этом файле нет действительного ключа RSA. Загляните внутрь /etc/ssl/private/postfix.pemи убедитесь, что он содержит хотя бы что-то, похожее на ключ RSA. Не вставляйте это в свой вопрос.

На самом деле, я просто заметил, что сообщение об ошибке для /etc/ssl/certs/postfix.pem, а не /etc/ssl/private/postfix.pem. Проверьте право собственности, разрешения и содержание /etc/ssl/certs/postfix.pem.


Это сообщение об ошибке немного сбивает с толку. Это говорит, cannot get RSA private key from file /etc/ssl/certs/postfix.pemно закрытый ключ должен быть в /etc/ssl/private/postfix.pem. У меня недостаточно опыта работы с Postfix с использованием TLS, чтобы понять, является ли это ошибкой Postfix или ошибкой в ​​вашей конфигурации.

Ladadadada
источник
Я преобразил оба файла в postfix: postfix перезапустил postfix, но попытка отправить электронное письмо все еще воспроизводит ошибку в /var/log/mail.log
phew
root @ domain: / etc / ssl / certs # ls -l postfix.pem -rw-r - r-- 1 постфикс postfix 1363 28 сентября 16:36 postfix.pem и, кажется, содержит содержимое сертификата, начиная с - --- НАЧАТЬ СЕРТИФИКАТ ----- содержащие данные до ----- КОНЕЦ СЕРТИФИКАТА -----
ФУ
Мне тоже было интересно об этом, поэтому я попытался обменяться файлами. Но это не имеет смысла, так как файл в / certs / содержит заголовок сертификата "---- BEGIN CERTIFICATE -----". В любом случае спасибо за вашу помощь.
уф
1

Сертификат должен соответствовать ключу, в моем случае не имеет ничего общего с разрешениями

создать самоподписанный сертификат и ключ https://msol.io/blog/tech/create-a-self-signed-ssl-certificate-with-openssl/

Надеюсь это поможет

user397245
источник
Не лучше ли использовать бесплатный сертификат для шифрования данных?
птенцы
До, спасибо! В результате копирования и вставки был получен один файл сертификата и не связанный ключ.
Адам
0

убедитесь, что на ключе нет парольной фразы. Вы можете удалить это с

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

если они вместе используют

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

Фраза-пароль выдаст в журналах предупреждение о том, что не удалось получить закрытый ключ RSAA, что, в свою очередь, отключает поддержку TLS. Надеюсь, это поможет кому-то!

user419756
источник