背景:我继承了一个嵌入式的基于Linux的系统,它包含一个SMTP代理和一些我必须忍受的古怪约束。它位于SMTP客户端和服务器之间。当SMTP客户端连接时,代理会打开与服务器的连接,并在进行一些即时处理后将客户端的数据传递给服务器。
挑战:我需要使用标准PKI技术和S / MIME格式在发送到服务器的路上签名和/或加密电子邮件(例如,请参阅RFC2311)。我可以从相应的证书中访问所有必需的公钥。
古怪的约束(请接受他们,因为他们远远超出我的控制范围):
问题:
感谢您的想法。
答案 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>
<强>附录:强>
OpenSSL支持可插拔加密“引擎”,可以代表库执行加密操作。实现这一点的最佳方法可能是为外部签名设备创建一个OpenSSL引擎,并在启用该引擎的情况下调用常规S / MIME OpenSSL函数。如果你的外部签名设备是“现成的”,可能已经有OpenSSL的引擎包装器。