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


14

我只是按照本教程进行操作,以使用dovecot和mysql作为虚拟用户的后端来设置postfix邮件服务器。

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

使用

echo TEST-MAIL | mail myaccount@hotmail.com

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

它也可以反向运行,因此我的example.com MX条目终于被传播了,因此我能够接收从myaccount@hotmail.com发送到myvirtualuser@example.com的电子邮件,并通过IMAP使用STARTTLS在Thunderbird中查看它们。

尝试使用登录到myvirtualuser@example.com的 Thunderbird 尝试将邮件发送到myaccount@hotmail.com时出现错误消息“ 5.7.1:中继访问被拒绝 ” 后,我需要做一些进一步的研究,我发现服务器正在运行作为“开放邮件中继”,这当然是一件坏事。

我进一步研究了本教程的可选部分,例如此注释其他文章,我决定也完成这些步骤,以便能够通过Mozilla Thunderbird 通过myvirtualuser@example.com发送邮件,而不会收到错误消息“ 5.7.1” :“中继访问被拒绝 ”(因为普通邮件服务器拒绝打开的中继电子邮件)。

但是现在我遇到了一个错误,试图让SMTPS使用postfix,它在/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中的端口465使用SMTP SSL / TLS从新安装的邮件服务器发送邮件后,立即记录该错误。雷鸟然后告诉我发生了超时。

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正确使用自行生成的自签名证书。

任何帮助表示赞赏!

编辑: 我只是试过这个不同的教程上生成后缀的自签名证书,仍然出现相同的错误。我真的不知道还要测试什么。

我也检查了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进行的证书/密钥检查确实显示两个文件均有效。

因此,这确实是一个权限问题!不知道将/etc/ssl/*/postfix.pem文件整理成postfix:postfix不足以使postfix读取文件。

Answers:


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限制为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,然后查看服务器是否可以访问该密钥。


这样就解决了,非常感谢您LadadadadaAnsgar Wiechers
phew 2012年

感谢您的postconf -n贡献。复制和粘贴产生了一个证书文件和一个不相关的密钥,并专注于该文件的输出,这让我看到了我已经检查但错过的配置文件中的错字...
Adam Kerz

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还是配置错误。


我把两个文件都塞进了postfix:postfix中,然后重新启动了postfix,但是尝试发送电子邮件仍然会在/var/log/mail.log中重现该错误
phew 2012年

root @ domain:/ etc / ssl / certs#ls -l postfix.pem -rw-r--r-- 1个postfix postfix 1363 Sep 28 16:36 postfix.pem,它似乎包含证书内容,以-开头--- BEGIN CERTIFICATE -----包含直到----- END CERTIFICATE -----的
phew 2012年

我也想知道,所以我尝试交换文件。但这没有任何意义,因为/ certs /中的文件确实包含证书标头“ ---- BEGIN CERTIFICATE -----”。无论如何,谢谢您的帮助。
phew 2012年


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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.