#dkim #tokio #smtp

viadkim

域密钥识别邮件(DKIM)规范的实现

13 个版本

0.2.0 2024 年 5 月 17 日
0.2.0-alpha.22024 年 4 月 13 日
0.2.0-alpha.12024 年 3 月 18 日
0.1.0 2023 年 11 月 24 日
0.0.1 2022 年 12 月 22 日

#376电子邮件


用于 2 crates

GPL-3.0-or-later

310KB
6K SLoC

viadkim

viadkim 库包含 域密钥识别邮件(DKIM)的完整实现。DKIM 规范在 RFC 6376 中。

该库提供了用于签名和验证电子邮件消息的高级 API,以及实现此功能所需使用的低级 API。它是一个基于 Tokio 异步运行时的异步库。

该库是根据 RFC 规范和相关文档从头独立开发的。以下概述的设计目标是指导开发的。

设计目标

viadkim 的目标是提供一个适合长期运行的邮件服务器进程的免费 DKIM 库,具有强大的 RFC 兼容性保证。

特别重要的是,库应该是 高效的。以下是一些值得注意的事项:并发执行公钥记录的 DNS 请求;在可能的情况下绕过或简化消息体处理,同时整个消息不必一次性全部加载到内存中;或者在不同签名评估任务之间共享消息体规范化结果。

同样重要的是 健壮性处理输入的兼容性。值得注意的是,viadkim 完全支持国际化电子邮件。但也透明地处理了实践中出现的格式不良的输入,例如标题中的散乱 Latin 1 字节。通常,所有输入都被优雅地处理,所有输出都应该格式良好。

此外,库的 广泛适用性 是一个目标:为签名和验证过程提供广泛的配置选项,以及产生大量输出数据的选项,应能够实现广泛的 DKIM 使用模式。

最后,严格 遵守 RFC 6376,包括 RFC 更新和勘误表。已提及对国际化电子邮件的支持,但例如,也采用了对支持的签名算法的最新建议,例如添加 ed25519-sha256 并退役 rsa-sha1

使用方法

这是一个 Rust 库。像往常一样,在 Cargo.toml 中包含 viadkim

两个结构体提供了使用 viadkim 进行 DKIM 处理的入口点

有关使用说明,请参阅 API 文档

最低支持的 Rust 版本为 1.67.0。

示例

包含两个简单的命令行工具作为示例,一个用于签名消息,另一个用于验证消息的签名。

程序 dkimsign 为标准输入提供的消息生成 DKIM 签名。它接受三个参数:包含签名密钥的 PKCS#8 PEM 格式密钥文件的路径、域名(d= 标签)和选择器(s= 标签)。然后它打印一个可以添加到消息前面的 DKIM-Signature 标头。

示例调用

cargo run --example dkimsign -- \
  /path/to/key.pem example.com selector < /path/to/msg-to-sign

程序 dkimverify 验证标准输入提供的消息的 DKIM 签名。它将每个验证结果打印为 Rust 数据结构。

示例调用

cargo run --features hickory-resolver \
  --example dkimverify < /path/to/msg-to-verify

在两个示例中,导出环境变量 RUST_LOG=viadkim=trace 以启用库的跟踪日志。编辑示例以实验不同的配置选项。

有关 viadkim 库的交互式使用,请参阅命令行工具 dkimdo

致谢

虽然这是一个从头开始创建的独立 DKIM 实现,但作者希望感谢 OpenDKIM 项目。作为 OpenDKIM 的长期用户,作者不禁采用了其中的一些设计思想。一个例子是“分阶段”处理方法,它不需要整个消息同时驻留在内存中。

许可证

版权 © 2022–2024 David Bürgin

本程序是自由软件:您可以按照自由软件基金会发布的 GNU 通用公共许可证的条款重新分发和/或修改它,许可证版本为 3,或者(根据您的选择)任何较新版本。

本程序分发的目的是希望它是有用的,但没有任何保证;甚至没有关于其适销性或适用于特定目的的隐含保证。有关详细信息,请参阅 GNU 通用公共许可证。

您应该已经随本程序收到了 GNU 通用公共许可证的一份副本。如果没有,请参阅 https://www.gnu.org/licenses/

依赖关系

~8–16MB
~241K SLoC