后缀“警告:不能从文件获得RSA私钥”

我只是按照这个教程来设置一个带有dovecot和mysql的postfix邮件服务器作为虚拟用户的后端。

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

运用

echo TEST-MAIL | mail [email protected] 

工作正常,当我login到我的Hotmail帐户,它显示电子邮件。

它也可以反向工作,因此我的example.com的 MX条目最终被传播了,所以我可以接收从[email protected]发送到[email protected]电子邮件,并使用STARTTLS通过IMAP在Thunderbird中查看它们。

在尝试使用login到[email protected] Thunderbird将邮件发送到[email protected]时,我收到错误消息“ 5.7.1:中继访问被拒绝 ”后做了一些调查,我发现我的服务器正在执行作为一个“开放的邮件中继”,这当然是一件坏事。

深入挖掘教程的可选部分, 如此评论和其他内容 ,我决定完成这些步骤,以便能够通过[email protected]通过Mozilla Thunderbird发送邮件,而不会收到错误消息“ 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: 

在我尝试使用SMTP SSL / TLS通过Thunderbird中的端口465从新安装的邮件服务器发送邮件之后,该错误即被logging下来。 雷鸟然后告诉我超时发生。

谷歌有关于这个问题的一些结果,但我没有得到它与任何这些工作。 我会链接一些在这里,但作为一个新的用户,我只允许使用两个超链接。

我的/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文件是按照上面的教程中所描述的那样创build的

 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的login工作正常。 唯一的问题是让postfix正确使用自己生成的自签名证书。

任何帮助感激!

编辑:我只是尝试这个不同的教程生成后缀自签名证书,仍然得到相同的错误。 我真的不知道还有什么要testing的。

我也检查了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文件chown到postfix:postfix是不足以让postfix读取文件的。

main.cf的内容不一定代表您的活动Postfixconfiguration。 检查以下两个参数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作为前三个限制,那么您不是开放中继。

validation/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/ 

因此,简单地input密钥文件不会对你有任何好处,因为目录权限会阻止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,看看服务器是否可以访问密钥。

这些指令有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 ,并确保它至less包含一些看起来像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或在您的configuration错误。

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

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

希望这可以帮助

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

 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支持。 希望这可以帮助别人!