Exim4 没有添加 DKIM 签名

aig*_*mss 7 email debian exim dkim

花了 2 天时间试图告诉 Exim 在我的 Debian8 服务器上添加 DKIM 签名。没有成功。已阅读许多操作方法、论坛,但在我的服务器上没有任何可能的解决方案。

已生成密钥:

cd /etc/exim4/

openssl genrsa -out example.com-private.pem 1024 -outform PEM
openssl rsa -in example.com-private.pem -out example.com.pem -pubout -outform PEM
Run Code Online (Sandbox Code Playgroud)

已创建文件

00_local_macros 
Run Code Online (Sandbox Code Playgroud)

/etc/exim4/conf.d/main/ 
Run Code Online (Sandbox Code Playgroud)

具有以下内容:

DKIM_CANON = relaxed
DKIM_SELECTOR = 20160604
DKIM_DOMAIN = ${lc:${domain:$h_from:}}
DKIM_PRIVATE_KEY=${if exists{/etc/exim4/${dkim_domain}-private.pem} {/etc/exim4/${dkim_domain}-private.pem}}
Run Code Online (Sandbox Code Playgroud)

已发布文本 DNS 记录:

20160604._domainkey.example.com
Run Code Online (Sandbox Code Playgroud)

带有公钥的内容:

k=rsa;p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDRpHpC2q1ycmaqdnYlf5WI5g7ZyiXybd6EFdOqk35Sl7ZNfSeZelbyxqgLN+BzHpbp4Z4JDtKLSgBwugCePhl2xVDtQvO9XfqwQLMO5PAOONCLTwoGYrViwf5ki2zIqS2uN5MpuRTKW/IiK3CtRId+w5gjdACAvkwZWBstKEDrQQIDAQAB

# update-exim4.conf
# service exim4 restart
Run Code Online (Sandbox Code Playgroud)

甚至重新启动了服务器。

所有电子邮件仍然在没有 DKIM 签名的情况下到达。

尝试添加行:

dkim_domain = ${lc:${domain:$h_from:}}
DKIM_PRIVATE_KEY=${if exists{/etc/exim4/${dkim_domain}-private.pem} {/etc/exim4/${dkim_domain}-private.pem}}
DKIM_CANON = relaxed
DKIM_SELECTOR = 20160604
dkim_sign_headers = true
Run Code Online (Sandbox Code Playgroud)

到某些论坛中建议的文件 /etc/exim4/conf.d./transport/30_exim4-config_remote_smtp 。没有成功。仍然没有 DKIM 签名。

exim4 -bV

Exim version 4.84_2 #2 built 13-Mar-2016 17:47:19
Copyright (c) University of Cambridge, 1995 - 2014
(c) The Exim Maintainers and contributors in ACKNOWLEDGMENTS file, 2007 - 2014
Berkeley DB: Berkeley DB 5.3.28: (September  9, 2013)
Support for: crypteq iconv() IPv6 GnuTLS move_frozen_messages DKIM PRDR OCSP
Lookups (built-in): lsearch wildlsearch nwildlsearch iplsearch cdb dbm dbmjz dbmnz dnsdb dsearch nis nis0 passwd
Authenticators: cram_md5 plaintext
Routers: accept dnslookup ipliteral manualroute queryprogram redirect
Transports: appendfile/maildir/mailstore autoreply lmtp pipe smtp
Fixed never_users: 0
Size of off_t: 8
Configuration file is /var/lib/exim4/config.autogenerated
Run Code Online (Sandbox Code Playgroud)

更新

几乎所有的教程都是错误的。对于单文件 Exim 配置,DKIM 设置必须位于 exim4.conf.template 文件中。有用!但是只有一个域这个配置:

DKIM_CANON = relaxed
DKIM_DOMAIN = example.com
DKIM_PRIVATE_KEY = /etc/exim4/dkim/example.com-private.pem
DKIM_SELECTOR = 20160604
#DKIM_STRICT = true
Run Code Online (Sandbox Code Playgroud)

多个域仍然不起作用。尝试了多种配置,但仍然没有成功。以下所有三个都不起作用:

DKIM_CANON = relaxed
DKIM_SELECTOR = 20160604
DKIM_DOMAIN = ${sender_address_domain}
DKIM_FILE = /etc/exim4/dkim/{DKIM_DOMAIN}-private.pem
DKIM_PRIVATE_KEY = ${if exists{DKIM_FILE}{DKIM_FILE}{0}}


DKIM_CANON = relaxed
DKIM_SELECTOR = 20160604
DKIM_DOMAIN = ${lc:${domain:$h_from:}}
DKIM_PRIVATE_KEY=${if exists{/etc/exim4/dkim/${DKIM_DOMAIN}-private.pem} {/etc/exim4/dkim/${DKIM_DOMAIN}-private.pem}}

DKIM_CANON = relaxed
DKIM_SELECTOR = 20160604
dkim_domain = ${lc:${domain:$h_from:}}
DKIM_PRIVATE_KEY=${if exists{/etc/exim4/${dkim_domain}-private.pem} {/etc/exim4/${dkim_domain}-private.pem}}
Run Code Online (Sandbox Code Playgroud)

Bil*_*hor 6

验证您是否正在使用remote_smtp传输。这应该T=/var/log/exim4/mainlog包含=>. 由于未使用此传输,因此无法在本地发送的电子邮件上检查 DKIM。使用验证服务来检查您的邮件是否已签名,例如http://dkimvalidator.com

如果您使用remote_smtp_smarthost传输,您必须修改它以包括 DKIM 签名。在带有拆分配置的 Debian/Ubuntu 机器上,将以下内容附加到30_exim4-config_remote_smtp_smarthost文件中:

# DKIM setup copied from `30_exim4-config_remove_smtp`
# see: https://serverfault.com/a/782069/117087
.ifdef DKIM_DOMAIN
dkim_domain = DKIM_DOMAIN
.endif
.ifdef DKIM_SELECTOR
dkim_selector = DKIM_SELECTOR
.endif
.ifdef DKIM_PRIVATE_KEY
dkim_private_key = DKIM_PRIVATE_KEY
.endif
.ifdef DKIM_CANON
dkim_canon = DKIM_CANON
.endif
.ifdef DKIM_STRICT
dkim_strict = DKIM_STRICT
.endif
.ifdef DKIM_SIGN_HEADERS
dkim_sign_headers = DKIM_SIGN_HEADERS
.endif
Run Code Online (Sandbox Code Playgroud)

验证您的私钥的权限。使用 Exim 运行时,它必须是可读的,用于 Debian 和 Ubuntu 安装的 Debian-exim。如果您的传输是 to dkim_strict,则如果它无法对消息进行签名,它将重新排队消息。它会将失败原因记录到mainlogpaniclog。在paniclog.

这些是使 DKIM 工作所需的设置。你好像少了一些。(我使用相同的密钥为多个域签名。尝试使用单个密钥进行签名,然后再尝试使用不同的域的不同密钥。)此配置应防止remote_smtp传输发送未签名的电子邮件。

DKIM_CANON = relaxed
DKIM_DOMAIN = ${sender_address_domain}
DKIM_PRIVATE_KEY = CONFDIR/dkim.private.20160604
DKIM_SELECTOR = ${extract{-1}{.}{DKIM_PRIVATE_KEY}}
DKIM_STRICT = true # optional - causes signing failures to defer (requeue)
#DKIM_SIGN_HEADERS = # Use default
Run Code Online (Sandbox Code Playgroud)

一旦您使用静态密钥进行签名。你可以试试这些改变

DKIM_PRIVATE_KEY = CONFDIR/${sender_address_domain}.private.201604
DKIM_SELECTOR = 20160604
DKIM_STRICT = false # optional - pass if no key available
Run Code Online (Sandbox Code Playgroud)

您可能需要查看: