使用长 dkim 密钥时 Opendkim 错误 "key retrieval failed"

Opendkim error "key retrieval failed" when long dkim keys are used

我将 postfix 与 opendkim 一起使用,发现了很多以下错误:

opendkim[63]: 84D4C390048: key retrieval failed (s=selector1, d=hotmail.com):
'selector1._domainkey.hotmail.com' reply truncated

很多不同的域都会出现此错误,但如果使用长 dkim 密钥(> 1024 位),则总是会出现此错误。我认为这是一个相当普遍的问题,但到目前为止找不到任何有用的东西。

这是我的 opendkim 配置问题还是 opendkim 在这方面出了问题?

这个问题似乎是因为 opendkim 没有设置伪资源记录 OPT UDPSize,表明它可以处理超过 512 字节的响应,如 EDNS (wiki), RFC 2671 所定义。

Opendkim(无 EDNS)

从 opendkim 请求的 tcpdump 中可以看出:

28112+ TXT? selector1._domainkey.outlook.com. (50)

以及未绑定的响应:

28112| q: TXT? selector1._domainkey.outlook.com. 1/0/0 selector1._domainkey.outlook.com.
CNAME selector1._domainkey.outbound.protection.outlook.com. (105)

挖掘(EDNS)

来自 dig 的相同请求正确地表明较大的响应是可以的 (OPT UDPsize=4096):

33350+ [1au] TXT? selector1._domainkey.outlook.com. ar: . OPT UDPsize=4096 (73)

并且 unbound 使用完整的 TXT 记录正确响应:

33350 q: TXT? selector1._domainkey.outlook.com. 2/0/1 
selector1._domainkey.outlook.com. CNAME 
selector1._domainkey.outbound.protection.outlook.com., 
selector1._domainkey.outbound.protection.outlook.com.
TXT "v=DKIM1;k=rsa;p=MIIBI[...]1913" ar: . OPT UDPsize=4096 (567)

为了简洁起见,TXT 记录中的 DKIM 密钥被截断了。

不幸的是,opendkim 项目似乎已经死了,所以不太可能修复这个问题。

libopendkim 进行的 res_query() 调用似乎没有通过重新传输请求来处理截断。它在我的开发服务器上运行,所以这似乎是一个本地配置选项。 res_query() 似乎没有办法强制使用 TCP 模式,但它的手册页建议您可以在本地 /etc/resolv.conf 中强制使用 TCP 模式。

否则,您可以通过链接到另一个解析器来解决这个问题,例如 OpenDKIM 支持的未绑定。