trusteddomainproject/OpenDKIM
GitHub: trusteddomainproject/OpenDKIM
OpenDKIM 是一个开源的 DKIM 邮件签名与验证工具,基于 milter 接口与 MTA 协作,提供发件人认证以对抗邮件伪造。
Stars: 116 | Forks: 61
# OPENDKIM 自述文件
本目录包含来自 The OpenDKIM Project 的最新开源 DKIM 过滤器软件。
官方网站位于 http://www.opendkim.org,提供最新更新。
+--------------+
| 介绍 |
+--------------+
Trusted Domain Project 是一项社区努力,旨在开发和维护一个开源库,用于生成支持 DKIM 的应用程序,以及一个基于“milter”的过滤器,用于提供 DKIM 服务。
DKIM 发件人认证系统最初由电子邮件签名技术组 (ESTG) 创建,现已成为 IETF 的草案标准 (RFC6376)。DKIM 是 Yahoo! Inc. 提出的 DomainKeys (DK) 提案与 Cisco 提出的 Internet Identified Mail (IIM) 提案的结合。
“milter”是“mail filter”的合成词,指一种在 MTA 与邮件过滤插件应用程序之间传递邮件流量信息的协议和 API。它最初由 Sendmail, Inc. 发明,但后来也被移植到其他 MTA。
OpenDKIM 项目始于 Sendmail, Inc. 开发并维护的开源“dkim-milter”包 2.8.3 版本的代码分支。OpenDKIM 项目使用的许可证详见 LICENSE 文件。本项目的部分内容也受 Sendmail 开源许可证保护,该许可证可在本发行版的“LICENSE.Sendmail”文件中找到。请查看每个源文件中的版权声明,以确定其是否受两种许可证共同保护。
本包包含一个实现 DKIM 服务的库,以及一个基于 milter 的过滤器应用程序,它可以插入任何支持 milter 的 MTA,为足够新版本的 sendmail、Postfix 或其他支持 milter 协议的 MTA 提供该服务。
还提供了一个可选的异步解析器库,用于解决大多数系统自带的基本 BIND 解析器的限制。
+--------------+
| 依赖项 |
+--------------+
要编译和运行,本包需要以下组件:
o OpenSSL (http://www.openssl.org,或向您的软件供应商索要包)。任何版本都可以入门,但如果您希望使用当前 DKIM 应用通常所需的 SHA256 消息摘要算法来签名或验证消息,则需要 v0.9.8 或更高版本。
o sendmail v8.13.0 (或更高版本),或 Postfix 2.3 (或更高版本),以及 libmilter。(仅当您构建过滤器时需要。)
o 能够访问正常运行的域名服务器 (仅用于签名验证)。
o 在 Linux 系统上,需要 libbsd (BSD 兼容性库) 或其他提供 strlcat() 和 strlcpy() 的库。
o 如果您希望将过滤器与 SQL 数据库接口,或存储统计信息到数据库中,则需要 OpenDBX v1.3.7 或更高版本。
o 如果您希望使用 Lua 解释器钩子进行过滤器策略控制,或使用统计扩展 (--enable-statsext),则需要 Lua v5.1 或更高版本。
o 如果您希望将过滤器与 LDAP 服务器接口,则需要 OpenLDAP v2.1.3 或更高版本。
o 对于过滤器或库中的本地哈希或 btree 数据库支持,需要 Oracle 的 BerkeleyDB。支持所有版本。
o 如果您有兴趣修改构建和打包结构,可能需要升级到以下版本的 GNU“autotools”组件:
autoconf (GNU Autoconf) 2.61
automake (GNU automake) 1.7 (或 1.9 以避免警告)
ltmain.sh (GNU libtool) 2.2.6 (或在 make maintainer-clean 后使用 1.5.26)
+-----------------------+
| 相关文档 |
+-----------------------+
opendkim (实际过滤器程序) 的手册页位于本源码发行版的 opendkim 目录中。INSTALL 和 FEATURES 文件,以及 opendkim 目录中的 README 文件提供了更多信息。变更在 RELEASE_NOTES 文件中记录。
libopendkim 的 HTML 样式文档位于本源码发行版的 libopendkim/docs 中。
有关 DKIM 的一般信息可在 http://www.dkim.org 找到。
讨论并支持本包中 DKIM 软件的邮件列表通过 opendkim.org 的列表服务器维护。请访问 http://www.opendkim.org 订阅或浏览存档。可用列表如下:
```
opendkim-announce (moderated) Release announcements.
opendkim-users General OpenDKIM user questions and answers.
opendkim-dev Chatter among OpenDKIM developers.
opendkim-cvs Automated source code change announcements.
May be renamed soon to something more general
since we're moving away from CVS.
```
Bug 跟踪通过 SourceForge 上的跟踪器完成,网址为 http://sourceforge.net/projects/opendkim。您可以在此提交新的 bug 报告,但在打开新问题之前,请先检查是否已有已打开甚至已关闭的旧 bug。
+---------+
| 警告 |
+---------+
由于 OpenDKIM 使用密码学,以下来自 OpenSSL 的信息同样适用于本包。
请记住,在世界某些地区,导出/进口和/或使用强密码学软件、提供密码学钩子,甚至只是交流密码学软件的技术细节都是非法的。因此,当您将本包导入您的国家、从那里重新分发它,甚至只是通过电子邮件向作者或其他人发送技术建议或源代码补丁时,强烈建议您密切关注适用于您的任何出口/进口和/或使用法律。作者对您在此处所做的任何违规行为概不负责。因此请小心,这是您的责任。
如果您使用 OpenSSL,请确保阅读其 README 文件,其中包含有关专利等信息。
+---------------------+
| 目录结构 |
+---------------------+
contrib 用户贡献的可能有用的脚本集合。
docs 与 opendkim 相关的 RFC 和草案集合。
libar 一个可选的线程安全异步解析器库。
libopendkim 一个实现提议的 DKIM 标准的库。
libopendkim/docs 描述 libopendkim 提供的 API 的 HTML 文档。
libvbr 一个实现 Vouch By Reference (VBR, RFC5518) 的可选库。
opendkim 一个基于 milter 的过滤器应用程序,使用 libopendkim (以及可选的 libar) 通过使用 mil 协议的 MTA 提供 DKIM 服务。
+----------------+
| 运行时问题 |
+----------------+
警告:符号 'X' 不可用
过滤器尝试从 MTA 获取一些信息,但 MTA 未提供。
在 MTA 与过滤器交互的各个阶段,包含正在进行的工作或正在处理的连接信息的某些宏会从 MTA 传递给过滤器。
对于 sendmail,MTA 应传递给过滤器的宏名称由 sendmail.cf 中的“Milter.macros”设置定义,例如“Milter.macros.connect”、“Milter.macros.envfrom”等。此消息表明过滤器需要宏 X 的内容,但该宏未从 MTA 传递下来。
通常,如果 sendmail.cf 是通过常见的 m4 方法生成的,过滤器需要的值会从 MTA 传递。如果您的 sendmail.cf 中没有定义这些选项,请确保您的 M4 配置文件是最新的,重新生成 sendmail.cf 以在您的 sendmail.cf 中添加适当的行,然后重新启动 sendmail。
MTA 超时
默认情况下,MTA 配置为等待过滤器响应最多十秒,然后放弃。当查询远程域名服务器获取密钥和策略数据时,DKIM 过滤器可能无法在该时间范围内从解析器获得响应,从而导致 MTA 超时。这可能导致消息被拒绝、临时失败或未经验证即投递,具体取决于为过滤器选择的失败模式。
当使用系统提供的标准解析器库时,DNS 超时无法调整。如果您遇到此问题,必须增加 MTA 等待回复的时间。请参阅 sendmail 开源发行版中的文档 (特别是 libmilter/README) 以了解更改这些超时值的说明。
当使用提供的异步解析器库时,您可以使用“-T”命令行选项更改超时,使其短于 MTA 超时值。
d2i_PUBKEY_bio() 失败
检索并解码公钥以执行消息验证后,OpenSSL 库尝试使用该密钥但失败。已知的可能原因包括:
(a) 内存耗尽
(b) 密钥损坏
如果您设置在这种情况下临时失败消息,远程端可能会重试消息。如果同一消息稍后再次失败,则密钥可能已损坏或无效。
您可以尝试编译时使用 _FFR_LOG_SSL_ERRORS,以便过滤器在发生此类情况时提取 OpenSSL 库错误并将其包含在系统日志中,以供进一步诊断。在一个观察到的案例中,损坏的密钥还导致记录了以下信息:
error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag;
error:0D07803A:asn1 encoding routines:ASN1_ITEM_EX_D2I:nested asn1 error
其他 OpenDKIM 问题:
请将任何 bug 报告发送至电子邮件地址 opendkim-users@lists.opendkim.org,或通过以下地址访问的 SourceForge 问题跟踪器:
https://sourceforge.net/p/opendkim/_list/tickets
+-----------------------------+
| Sendmail 重写功能 |
+-----------------------------+
sendmail MTA 有两个功能,如果激活,可能会干扰 DKIM 服务的成功使用。这两个功能是 MASQUERADE_AS 和 FEATURE(genericstable)。更多信息请参阅开源 sendmail 源码发行版中的 cf/README。
由于 milter 协议集成到 MTA 中的方式,opendkim 在看到这些功能要求的头部修改之前就已经看到了头部。这意味着 DKIM 签名是基于邮件客户端最初注入的头部生成的,而不是基于 MTA 实际发送的头部。因此,接收方的验证代理将无法验证签名,因为签名数据与接收数据不匹配。
解决此问题的建议方案:
(1) 发送邮件时使头部已按需编写,从而无需这些功能 (或者直接关闭它们)。
(2) 设置两个 MTA,可以在不同的机器上或在同一台机器上。第一个 MTA 应完成所有重写 (即使用这两个功能),第二个 MTA 应使用 opendkim 添加签名,并且完全不进行重写。
(3) 在配置文件中使用多条 DaemonPortOptions 行。第一个守护进程端口 (端口 25) 进行头部重写,然后将消息路由到第二个端口;第二个端口不进行重写,但进行签名,然后将消息发送出去。
Sendmail 还有一个功能,会导致它在签名之后、传输之前更改地址。这个功能默认启用,它会将头部字段中的地址传递给解析器函数以确保它们是规范的。这可能导致在消息签名之后才将这些字符串替换为其规范形式,从而使签名失效。要禁用此功能,请在您的 sendmail.mc 和 submit.mc 配置文件中添加以下行,重新生成配置并重新启动过滤器:
```
FEATURE(`nocanonify')
```
--
Copyright (c) 2010-2012, 2014, The Trusted Domain Project.
保留所有权利。
标签:DKIM, Milter, Postfix, RFC6376, rizin, Sendmail, 反垃圾邮件, 域名密钥, 安全测试工具, 客户端加密, 开源, 电子邮件认证, 邮件基础设施, 邮件安全, 邮件网关安全, 邮件过滤, 邮件验证