我使用 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 打招呼。
EHLO mail.example.com
此命令生成“未提供客户端证书”。
这很奇怪,因为我可以从字面上看到前面输出中的公共证书。我有一种感觉,我在这里遗漏了一些概念性的东西。例如,我是否需要告诉客户端发送或使用公共证书?Postfix 服务器上的公共证书与客户端证书不同吗?
目标:我的总体目标是将 Postfix 配置为加密电子邮件,而不是发送未加密的电子邮件。
这是postconf -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
您已
smtpd_tls_req_ccert
在 Postfix 配置中进行设置。该指令要求所有客户端都具有您颁发给该特定客户端的客户端证书。然后,仅允许来自预先批准的主机的传入 SMTP 连接到您的服务器。
这显然不是你想要的。您正在尝试从整个 Internet 接收邮件,并且您不可能向世界上的每个 SMTP 服务器颁发客户端证书。
首先,删除该指令,然后重试。您可能还有其他问题,但这是导致直接问题的原因。