使用 Apache Camel 进行邮件签名和加密

Mail signing and encrypting with Apache Camel

我想对我的邮件进行签名和加密。

我目前的骆驼版本是2.13.0.

是否有我可以用于此目的的骆驼功能?

Body 是纯文本,因此不能使用 XMLDSig 等。

预期结果应该是一封包含这些 headers:

的邮件

我不是 Camel 用户,但我很好奇并尝试了一下。您想要的是 S/MIME 签名和加密。这目前不可用,但有一个 ticket 用于它,自 2015 年 2 月创建以来从未得到任何响应。Camel 具有 MIME-Multipart 数据格式,PGP 加密(但仅对称),Sign/Verify(没有加密)-但我看不出有什么办法可以将它们组合起来,以便真正获得有效的 S/MIME 信封,用于签名 + 加密的电子邮件。此外,PGP 不是 S/MIME,反之亦然。

我知道如何通过 JavaMail + BouncyCastle 库编写和发送此类电子邮件,我什至有它的示例代码。从理论上讲,您可以通过 JavaMail + BouncyCastle 创建 MIME 消息,然后使用 Camel 发送它或创建您自己的 S/MIME 端点或数据格式(至少是一种编组方式,如果不需要,则跳过解组)。但是我还没有找到开箱即用的方法。


更新:

即使我将预配置的签名和加密 MIME 部分放在输入端点上并执行此操作...

.setHeader("From", simple("sender@web.de"))
.setHeader("To", simple("recipient@web.de"))
.setHeader("Subject", simple("Signed & encrypted"))
.setHeader("Content-Type", simple("application/pkcs7-mime; name=\"smime.p7m\"; smime-type=enveloped-data"))
.setHeader("Content-Transfer-Encoding", simple("base64"))

... 并且邮件已发送,像 Thunderbird 这样的邮件客户端无法真正显示邮件,因为 Camel 邮件端点用值 7bit 覆盖了 Content-Transfer-Encoding。此问题有 another ticket,但自 2014 年 6 月以来也未解决。因此,在通过 JavaMail 和 BouncyCastle 构建消息后,暂时甚至无法使用邮件端点发送消息。你甚至必须自己发送(通过 JM + BC 也很简单,但很烦人)。所以目前你不能真正使用 Camel 基础设施,因为端点和数据格式不适合 S/MIME 消息组合。

我解决了发送问题

我创建了一个包含所有必需参数的新 MimeMessage,例如 fromrecipientsubject和内容(包含 body 和附件的多部分)。

使用 BouncyCastle 我 signed and encrypted 这个 MimeMessage。

我将生成的 MimeMessage 设置为 body 并使用标准的骆驼邮件端点发送它。所有必需的参数将从 MimeMessage 本身而不是从交换中选择 headers.

对于接收,我也将使用骆驼邮件标准,但使用参数 mapMailMessage=false 我可以处理收到的 javax.mail.Message 本身没有预处理。对于解密,我还将使用 BouncyCastle。