我正在考虑使用 zeromq 作为我的应用程序之间的消息传递层。至少在某些情况下,我希望通信是安全的,并且我正在考虑 SSL。
是否有一些标准方法如何启用 ssl 启用 zeromq?据我了解,它不支持开箱即用。
如果我在连接到套接字时只有一个参数会很好(bool:useSsl):)
有任何想法吗?
了解到这并不是您问题的真正答案,我将使用 RSA 直接加密消息,然后使用 0mq 发送它们。
在没有在我选择的平台中经过全面测试和实施的更集成的加密方法的情况下,这就是我要采用的方法。0mq 最近刚刚发布了第 4 版,其中包含了加密功能,但它仍然被认为是实验性的,并且语言绑定不完全支持它。
加密消息,而不是连接,似乎提供了最简单的升级路径,考虑到我们目前必须如何实施加密,我们的目的的区别几乎只是语义。
编辑:我现在比写这篇文章时更了解加密,RSA 不是加密消息数据的合适选择。使用 AES,手动共享密钥(这是我们的短期方法)或实施密钥共享方案,如 Jim Miller 的回答......但请注意,如果您采用后一种方法,安全地设计和实施密钥共享方案很难。比你想象的要难。您可以直接实现 SSL/TLS(使用消息 BIO),其他人已经这样做了,这也不简单,但至少知道 SSL 方案是行业标准,因此满足最低安全要求。
简而言之,在 ZMQ 4 中的椭圆曲线加密被认为是可靠的并成为标准之前,“公认的解决方案”将是在连接上手动实施 SSL/TLS,如果失败,则使用具有安全密钥共享的 AES 128 或 256机制(密钥共享是适当使用 RSA 的地方)。
我们目前正在使用 0mq 实现一个预共享密钥解决方案,该解决方案实现了一个松散地基于 TLS/SSL 的密钥交换协议。
本质上,我们有一个数据聚合器服务,它通过多播 0mq 发布者发布加密的健康状态数据。使用对称密钥 (AES128) 来加密数据,并且可以从作为 0mq 上更简单的请求/响应模型运行的第二个服务中检索。
为了检索对称密钥 (PSK),我们正在实现以下协议:
一旦客户端拥有 PSK,它就可以解密通过多播检索到的消息。
我们还在研究实现会话过期算法,该算法在多播服务中使用两个封装密钥。一个密钥是当前会话密钥,第二个是旧的、即将到期的密钥。这样,客户端就有更多的时间来检索新密钥,而不必在检索新密钥之前缓冲加密消息。
根据 zeromq.org 的说法,它尚不支持,但他们正在研究它。看起来它被建议作为Google Summer of Code的一个项目。