即时电子邮件加密/签名

Ada*_*iss 0 linux email encryption embedded

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

挑战:我需要在使用标准PKI技术和S/MIME格式(例如,参见RFC2311)的途中签署和/或加密电子邮件.我可以从相应的证书中访问所有必需的公钥.

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

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

问题:

  1. 我希望能找到一个开放源码的工具或库,会产生相应的MIME头和加密/签名数据的BLOB,但我没有发现,Sourceforge上,谷歌的代码, 您使用一个,你可以推荐?
  2. 我非常希望找到一个RFC,它说可以对100MB的数据进行散列,然后对散列进行签名,因为这样可以缓解9600bps的瓶颈.但同样,没有运气.是否存在与典型电子邮件客户端兼容的行业标准"快捷方式"(RFC?)?

谢谢你的想法.

caf*_*caf 5

问题1:

OpenSSL既是实用程序是库,可以创建和验证S/MIME消息,包括MIME头.有关实用程序版本的使用,请参见smime(1)手册页 - 这些都是使用库版本构建的,因此它也可以使用它.

问题2:

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

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

然后你可以使用多部分/签名的MIME对象并根据S/MIME规范对其进行加密,然后再次签署整个蜡球(Sign-Encrypt-Sign模式),这样你最终可以:

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

附录:

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