![Postfix“警告:无法从文件中获取 RSA 私钥”](https://linux22.com/image/597189/Postfix%E2%80%9C%E8%AD%A6%E5%91%8A%EF%BC%9A%E6%97%A0%E6%B3%95%E4%BB%8E%E6%96%87%E4%BB%B6%E4%B8%AD%E8%8E%B7%E5%8F%96%20RSA%20%E7%A7%81%E9%92%A5%E2%80%9D.png)
我刚刚关注本教程为虚拟用户设置一个以 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 支持。希望这对某些人有帮助!