经过多次测试并重新追溯我的步骤后,我仍然无法让 Google 邮件进行验证。
我的邮件服务器是 Debian 5.0 和 exim
Exim version 4.72 #1 built 31-Jul-2010 08:12:17
Copyright (c) University of Cambridge, 1995 - 2007
Berkeley DB: Berkeley DB 4.8.24: (August 14, 2009)
Support for: crypteq iconv() IPv6 PAM Perl Expand_dlfunc GnuTLS move_frozen_messages Content_Scanning DKIM Old_Demime
Lookups: lsearch wildlsearch nwildlsearch iplsearch cdb dbm dbmnz dnsdb dsearch ldap ldapdn ldapm mysql nis nis0 passwd pgsql sqlite
Authenticators: cram_md5 cyrus_sasl dovecot plaintext spa
Routers: accept dnslookup ipliteral iplookup manualroute queryprogram redirect
Transports: appendfile/maildir/mailstore/mbx autoreply lmtp pipe smtp
Fixed never_users: 0
Size of off_t: 8
GnuTLS compile-time version: 2.4.2
GnuTLS runtime version: 2.4.2
Configuration file is /var/lib/exim4/config.autogenerated
我的远程 smtp 传输配置:
remote_smtp:
debug_print = "T: remote_smtp for $local_part@$domain"
driver = smtp
helo_data = mailer.mydomain.com
dkim_domain = mydomain.com
dkim_selector = mailer
dkim_private_key = /etc/exim4/dkim/mailer.mydomain.com.key
dkim_canon = relaxed
.ifdef REMOTE_SMTP_HOSTS_AVOID_TLS
hosts_avoid_tls = REMOTE_SMTP_HOSTS_AVOID_TLS
.endif
.ifdef REMOTE_SMTP_HEADERS_REWRITE
headers_rewrite = REMOTE_SMTP_HEADERS_REWRITE
.endif
.ifdef REMOTE_SMTP_RETURN_PATH
return_path = REMOTE_SMTP_RETURN_PATH
.endif
.ifdef REMOTE_SMTP_HELO_FROM_DNS
helo_data=REMOTE_SMTP_HELO_DATA
.endif
我的私钥路径是正确的。
当我的邮件最终进入我的 Gmail 帐户时,我看到其中有一个 DKIM 标头:
DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=mydomain.com; s=mailer;
h=Content-Type:MIME-Version:Message-ID:Date:Subject:Reply-To:To:From; bh=nKgQAFyGv<snip>tg=;
b=m84lyYvX6<snip>RBBqmW52m1ce2g=;
但是,gmail 标头始终报告 dkim=neutral(无签名):
dkim=neutral (no signature) [email protected]
我的 DNS 结果:
dig +short txt mailer._domainkey.mydomain.com
mailer._domainkey. mydomain.com descriptive text "v=DKIM1\; k=rsa\; t=y\; p=LS0tLS1CRUdJ<snip>M0RRRUJBUVV" "BQTRHTkFEQ0J<snip>GdLamdaaG" "JwaFZkai93b3<snip>laSCtCYmdsYlBrWkdqeVExN3gxN" "mpQTzF6OWJDN3hoY21LNFhaR0NjeENMR0FmOWI4Z<snip>tLQo="
请注意,base64 公钥长 364 个字符,所以我必须使用 bind9 来分解密钥。
$ORIGIN _domainkey. mydomain.com.
mailer TXT ("v=DKIM1; k=rsa; t=y; p=LS0tLS1CRUdJTiBQVUJM<snip>U0liM0RRRUJBUVV"
"BQTRHTkFEQ0JpUUtCZ1<snip>15MGdLamdaaG"
"JwaFZkai93b3lDK21MR<snip>YlBrWkdqeVExN3gxN"
"mpQTzF6OWJDN3hoY21L<snip>Ci0tLS0tRU5E"
"IFBVQkxJQyBLRVktLS0tLQo=")
有人能给我指明正确的方向吗?我将不胜感激。
答案1
不要破坏密钥。只需将其添加为单个字符串即可。它会在大多数编辑器中自动换行。我的密钥如下所示。
rsa1._domainkey IN TXT“v=DKIM1;t=s;p=MHwwDQYJKoZIhvcNAQEBBQADawAwaAJhAKq2Ul9a5ixDPQm9WMoPI9fUEZU8FZwfux/O9Sl5+GDCR4rt0CsBzyZj4PY5DTtVHix++EZkR5rVdM4W59DtweKCK6XVntq4Y4GSm+gfZkf/fq45BSCQNilbYux4xqsHQIDAQAB”
我不相信 DKIM 支持重新组合字符串。如果您使用的是多行格式,请验证它是否已重新组合成一个整体。如果使用额外的引号,它可能会中断。您的 DNS 查找显示情况确实如此。
我经常看到 SPF 记录显示为"v=spf1" "a" "-all"
,读作vspf1a-all
。此记录应作为 传递,v=spf1 a -all
但可以作为 工作"v=spf1 " "a " "-all"
。SPF 确实指定了对引用部分的支持,方法是按原样连接各部分而不引入额外空格。这允许在单词中间换行。
编辑:我正在使用多字符串格式的密钥进行测试。但是,我需要等到 DNS 更新。 [电子邮件保护]告诉我我的新密钥不存在。
我从 bind 获得的格式与文档中让我相信应该获得的格式不匹配。文档表明我应该看到一个字符串连接我输入的片段。相反,我看到的是区域文件中输入的片段。
使用 bind 进行的测试表明文本片段最大可达 255 个字符。超过该长度的部分需要拆分。无论如何,两个这样的片段都可能超出 UPD 数据包的容量。
RFC 的审查表明 2048 位密钥大小可能是实际极限。对实施者发出警告,他们可能必须处理 TXT 片段并按顺序重新组装它们。
答案2
无论如何,你都会混淆公开的数据,这对我们帮助你没有帮助。
例如,我们无法检查以确保您更新了 SOA 序列号,并且此更改已发送到所有 NS 服务器,并且这是通过 SOA 中的负 TTL 完成的,该负 TTL 足够低,以至于 Gmail 不会合理地看到任何数据。
在 DNS TXT 记录中使用多个“...”序列不会合并为一个字符串,而是提供多个字符串。然后由应用程序/协议/规范决定如何处理这些字符串;例如“用空格连接”、“直接连接”、“仅使用第一个”。
DKIM 规范说要直接加入,但这是直接进入实施者容易忽视的领域。我鼓励您提供一个字符串作为 TXT 记录中的唯一字符串,看看这是否会改变一切。
我使用 Exim、DKIM 和 Gmail总是验证它;您的 Exim 配置正确。因此,要么您的 DNS 不可见,要么 Gmail 不喜欢 TXT 记录中的多个字符串。
您还可以尝试一些 DKIM 测试服务:
- 发件人身份验证测试服务 <[电子邮件保护]>
- [电子邮件保护]
- 这三个地址为:http://www.port25.com/domainkeys/