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


我跟着说 本教程 使用dovecot和mysql设置postfix邮件服务器作为虚拟用户的后端。

现在我得到了大部分工作,我可以连接到POP3(S)和IMAP(S)。

运用

echo TEST-MAIL | mail myaccount@hotmail.com

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

它也反向工作,因此我的MX条目 example.com 终于被传播了,所以我能够收到来自的电子邮件 myaccount@hotmail.com 至 myvirtualuser@example.com 并通过IMAP使用STARTTLS在Thunderbird中查看它们。

收到错误消息后再做一些研究“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通过Thunderbird中的端口465从我新安装的邮件服务器发送邮件后立即记录该错误。然后Thunderbird告诉我发生超时。

谷歌有一些关于这个问题的结果,但我无法让它与任何这些问题合作。我会在这里链接其中的一些,但作为一个新用户,我只允许使用两个超链接。

我的 /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)

之后 Ansgar Wiechers 指示它最终工作。

postconf -n 包含应该的线条。通过openssl进行的证书/密钥检查确实显示两个文件都有效。

所以它确实是一个权限问题!不知道chet'ing /etc/ssl/*/postfix.pem文件到postfix:postfix不足以让postfix读取文件。


14
2017-09-28 16:07






答案:


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


16
2017-09-28 19:04



修好了,非常感谢你们俩 Ladadadada 和 Ansgar Wiechers。 - phew
谢谢你 postconf -n 部分。复制和粘贴导致一个证书文件和一个不相关的密钥,并专注于输出,让我看到配置文件中的错误,我已经检查但错过了... - Adam Kerz


这些说明有 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或配置中的错误。


2
2017-09-28 16:18



我chown'ed两个文件postfix:postfix然后重新启动后缀,但尝试发送电子邮件仍在重现/var/log/mail.log中的错误 - phew
root @ domain:/ etc / ssl / certs #ls -l postfix.pem -rw-r - r-- 1 postfix postfix 1363 Sep 28 16:36 postfix.pem 它似乎包含证书内容,从 -----开始证书----- 包含数据直到 -----结束证书----- - phew
我也想知道这一点,所以我尝试交换文件。但这没有任何意义,因为/ certs /中的文件包含证书标题“---- BEGIN CERTIFICATE -----”。无论如何,谢谢你的帮助。 - phew


Cert必须匹配密钥,在我的情况下与权限无关

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

希望这可以帮助


1
2018-01-26 15:55



使用免费的加密证书不是更好吗? - chicks
啊,谢谢!复制和粘贴导致一个证书文件和一个不相关的密钥。 - Adam Kerz


检查密钥上没有密码。你可以删除它

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


0
2018-06-11 13:09