我使用 OpenSSL 创建私钥和自签名公共证书。然后我创建了一个包含私钥和公共证书的证书颁发机构文件 (mail.example.com.pem)。在 LAN 中的客户端计算机上,我使用 OpenSSL 连接到端口 587 (SMTP) 上的 Postfix,并告诉 OpenSSL 使用证书颁发机构文件 (mail.example.com.pem)。
openssl s_client -connect mail.example.com:587 -starttls smtp -CAfile /etc/pki/tls/private/mail.example.com.pem
这会产生相当多的输出。输出中包含来自证书颁发机构文件的公共证书。
在输入完所有 TLS、证书和其他安全信息后,我看到一个闪烁的光标,因此我尝试向 Postfix 说 Hello。
EHLO mail.example.com
此命令产生“未提供客户端证书”的结果。
这很奇怪,因为我可以在前面的输出中看到公共证书。我觉得我在这里缺少了一些概念性的东西。例如,我需要告诉客户端发送或使用公共证书吗?Postfix 服务器上的公共证书与客户端证书不同吗?
目标:我的总体目标是配置 Postfix 来加密电子邮件,而不是发送未加密的电子邮件。
以下是后配置-n命令:
data_directory = /var/lib/postfix
home_mailbox = Maildir/
inet_interfaces = all
inet_protocols = all
mail_owner = postfix
mailbox_command =
mydestination = example.com, localhost.example.com, localhost
mynetworks_style = host
queue_directory = /var/spool/postfix
smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_unauth_destination
smtpd_sasl_auth_enable = no
smtpd_sasl_path = private/auth
smtpd_tls_CAfile = /etc/pki/tls/mail.example.com.pem
smtpd_tls_auth_only = yes
smtpd_tls_cert_file = /etc/pki/tls/mail.example.com.crt
smtpd_tls_key_file = /etc/pki/tls/mail.example.com.key
smtpd_tls_loglevel = 3
smtpd_tls_req_ccert = yes
smtpd_tls_security_level = encrypt
smtpd_tls_session_cache_database = btree:/var/lib/postfix/smtpd_tls_cache
smtpd_tls_session_cache_timeout = 3600s
tls_random_exchange_name = /var/lib/postfix/prng_exch
tls_random_source = dev:/dev/urandom
答案1
您已设定smtpd_tls_req_ccert
在您的 Postfix 配置中。
该指令要求所有客户都拥有客户您向该特定客户端颁发的证书。这样,只有预先批准的主机才允许连接到您的服务器的 SMTP 传入连接。
这显然不是您想要的。您正在尝试从整个 Internet 接收邮件,并且不可能向世界上每个 SMTP 服务器颁发客户端证书。
首先,删除该指令,然后重试。您可能遇到其他问题,但这是导致直接问题的原因。