Postfix“警告:无法从文件中获取 RSA 私钥”

Postfix“警告:无法从文件中获取 RSA 私钥”

我刚刚关注本教程为虚拟用户设置一个以 dovecot 和 mysql 为后端的 postfix 邮件服务器。

现在大部分部分都可以运行了,我可以连接到 POP3(S) 和 IMAP(S)。

使用

echo TEST-MAIL | mail [email protected]

运行正常,当我登录我的 hotmail 帐户时它会显示电子邮件。

反过来也是一样,因此我的 MX 输入为示例.com终于传播开了,所以我能够收到来自[电子邮件保护][电子邮件保护]并通过 IMAP 使用 STARTTLS 在 Thunderbird 中查看它们。

收到错误消息后,我做了一些进一步的研究5.7.1:中继访问被拒绝“尝试发送邮件至[电子邮件保护]使用 Thunderbird 登录[电子邮件保护],我发现我的服务器充当了“开放邮件中继”,这当然是一件坏事。

深入了解教程的可选部分,例如此评论其他教程,我决定完成这些步骤,以便能够通过[电子邮件保护]通过 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:

当我尝试使用 Thunderbird 中的 SMTP SSL/TLS 通过端口 465 从新安装的邮件服务器发送邮件时,立即记录了该错误。然后 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 文件 chown 为 postfix:postfix 是否足以让 postfix 读取这些文件。

答案1

的内容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 并查看服务器是否可以访问密钥。

答案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。我对使用 TLS 的 Postfix 没有足够的经验,不知道这是 Postfix 的错误还是您的配置错误。

答案3

证书必须与密钥匹配,在我看来与权限无关

创建自签名证书和密钥https://msol.io/blog/tech/create-a-self-signed-ssl-certificate-with-openssl/

希望这可以帮助

答案4

检查密钥上是否没有密码。你可以使用以下命令删除它

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 支持。希望这对某些人有帮助!

相关内容