即时电子邮件加密/签名

时间:2009-10-08 02:58:09

标签: linux email encryption embedded

背景:我继承了一个嵌入式的基于Linux的系统,它包含一个SMTP代理和一些我必须忍受的古怪约束。它位于SMTP客户端和服务器之间。当SMTP客户端连接时,代理会打开与服务器的连接,并在进行一些即时处理后将客户端的数据传递给服务器。

挑战:我需要使用标准PKI技术和S / MIME格式在发送到服务器的路上签名和/或加密电子邮件(例如,请参阅RFC2311)。我可以从相应的证书中访问所有必需的公钥。

古怪的约束(请接受他们,因为他们远远超出我的控制范围)

  1. 我无法存储电子邮件; 必须即时处理。
  2. 我可以使用公钥在本地进行加密,但我不能直接访问私钥,这意味着数字签名必须由“签名设备”通过9600bps连接完成。 / LI>
  3. 典型的电子邮件大小为数十或数百MB 。 (电子邮件服务器和收件人可以处理这些大小;唯一的问题是签名时出现无法接受的延迟。)
  4. 任何新代码都应在C中,但只要数据永远不会存储,就可以将数据传输到独立的实用程序进行加密/签名( >例如没有临时文件。)
  5. 交货时间为14-21天。
  6. 问题:

    1. 我希望找到一个开源实用程序或库来生成相应的MIME标头并加密/签署一个数据块,但我没有在Sourceforge,Google代码,等上找到它。 / em>您是否使用过可以推荐的产品?
    2. 我非常希望找到一个RFC,它说可以对100MB数据进行散列,然后对散列进行签名,因为这样可以缓解9600bps的瓶颈。但同样,没有运气。是否存在与典型电子邮件客户端兼容的行业标准“快捷方式”(RFC?)?
    3. 感谢您的想法。

1 个答案:

答案 0 :(得分:5)

问题1:

OpenSSL既是一个实用程序又是一个库,可以创建和验证S / MIME消息,包括MIME头。有关实用程序版本的用法,请参阅the smime(1) man page - 这些都是使用库版本构建的,因此它也可以使用它。

问题2:

不仅可以接受,而是S / MIME签名总是完成的方式。您可能会使用multipart / signed格式创建签名消息(请参阅RFC2311的第3.4.3节)。此多部分MIME类型包含分离的签名作为MIME类型为application / pkcs7-signature的对象。 3.4.3.1节告诉我们这包含一个PKCS#7 signedData对象。 PKCS#7在RFC2315中描述,signedData对象在第9节中描述。​​本节告诉我们,我们创建了要签名的消息的消息摘要(S / MIME表示实现必须至少理解MD5和SHA1消息摘要,因此您将使用SHA1作为具有最佳安全性的可互操作选项),并使用签名者的私钥对其进行加密。

只要签名设备很乐意从您那里获取SHA1哈希并使用签名者的私钥对其进行加密,那么您可以自己完成所有剩余的签名生成。

然后您将获取多部分/已签名的MIME对象并根据S / MIME规范对其进行加密,然后再次签署整个蜡球(Sign-Encrypt-Sign模式),以便最终获得:< / p>

  • multipart / signed对象,第一部分是:
  • 一个application / pkcs7-mime对象,当由以下PKCS#7解密时包含:
  • 另一个多重/签名对象,第一部分是:
  • 表示原始电子邮件的MIME对象(或仅仅是正文;无论您需要什么......)

<强>附录:

OpenSSL支持可插拔加密“引擎”,可以代表库执行加密操作。实现这一点的最佳方法可能是为外部签名设备创建一个OpenSSL引擎,并在启用该引擎的情况下调用常规S / MIME OpenSSL函数。如果你的外部签名设备是“现成的”,可能已经有OpenSSL的引擎包装器。