3

当我使用常规 UDP 套接字时,我从 recvfrom() 获取远程客户端的地址。当我使用常规 TCP 套接字时,我会在调用 accept() 时获取远程客户端的地址。但是,在 ZeroMQ 中,似乎没有很好的方法来获取远程客户端的地址。如果我想用它来接受来自互联网上通常不受信任的第三方的请求,那么这非常不方便,因为例如我无法过滤允许哪些远程节点订阅特定的发布者套接字。

我错过了什么?ZMQ 真的只适合在受防火墙保护的 LAN/VLAN 上使用吗?例如,每条消息上的简单“源地址”元数据字段将非常有用,就像注册允许或禁止绑定套接字上的连接的“网守”的某种方式一样。

请注意,套接字上的“IDENTITY”选项不能解决这个问题,因为它很容易被任何来源欺骗。相反,如果远程实体想要得到任何数据包作为响应,源 IP/端口是不可欺骗的。

4

1 回答 1

0

老问题,但让我给出我的意见,因为我也遇到过这个问题。

我的客户通过他们的 CURVE 密钥进行身份验证(和加密)。但是,似乎一旦将客户端的公钥添加到服务器(zmq.AuthCurveAdd),一切都会在后台完成并且对开发人员隐藏。意思是,我知道我的客户已获得服务器授权(因为他们有一个服务器信任的密钥对),但我不知道谁是谁。正如您在上面提到的,身份存在同样的问题。我必须相信我的客户就是他们所说的那样。

我维护密钥身份验证/加密以及身份,但添加另一层以获得更好的身份验证(将给定消息绑定到特定客户端):客户端将其身份存储在配置文件中,服务器将其存储在 SQL 表中到密码哈希。客户端在每条消息中发送其标识(当然),以及其密码的哈希值。很简单,但它有效。

现在我需要做的是使用 HMAC / 类似的东西,这样我就不仅仅依靠哈希来进行身份验证。但是您可以看到我的意思(我必须在 ZMQ 之上设计自己的解决方案)。

于 2019-04-27T20:46:16.403 回答