ZMQ 加密:如何知道握手何时失败?

ZMQ encryption: how to know when the handshake failed?

上下文

用例

我想知道我的客户什么时候使用了错误的密钥(他知道的三个中的一个或多个是错误的)。

玩这个用例时,今天连接失败如预期但我无法知道连接失败是否因为加密握手失败。

注意:当我设置好密钥时,连接也正常

设置

服务器:

客户:

行为

我 运行 我的服务器和客户端在两个简单的控制台应用程序中,客户端使用了错误的服务器公钥。

服务器监控socket的日志记录如下:

Router monitoring event: MONITOR_STARTED - 
Router monitoring event: LISTENING - tcp://0.0.0.0:20100
Router monitoring event: ACCEPTED - tcp://0.0.0.0:20100
Router monitoring event: DISCONNECTED - tcp://0.0.0.0:20100
Router monitoring event: ACCEPTED - tcp://0.0.0.0:20100
Router monitoring event: DISCONNECTED - tcp://0.0.0.0:20100
Router monitoring event: ACCEPTED - tcp://0.0.0.0:20100
Router monitoring event: DISCONNECTED - tcp://0.0.0.0:20100
Router monitoring event: ACCEPTED - tcp://0.0.0.0:20100
Router monitoring event: DISCONNECTED - tcp://0.0.0.0:20100
Router monitoring event: ACCEPTED - tcp://0.0.0.0:20100

And so on...

这是执行此用例时刚刚发生的控制台跟踪:

CURVE I: cannot open client HELLO -- wrong server key?
CURVE I: cannot open client HELLO -- wrong server key?
CURVE I: cannot open client HELLO -- wrong server key?
CURVE I: cannot open client HELLO -- wrong server key?
CURVE I: cannot open client HELLO -- wrong server key?

And so on...

这里是客户端监控套接字的日志轨迹:

Dealer monitoring event: MONITOR_STARTED - 
Dealer monitoring event: CONNECT_DELAYED - tcp://127.0.0.1:20100
Dealer monitoring event: CONNECTED - tcp://127.0.0.1:20100
Dealer monitoring event: DISCONNECTED - tcp://127.0.0.1:20100
Dealer monitoring event: CONNECT_RETRIED - tcp://127.0.0.1:20100
Dealer monitoring event: CONNECT_DELAYED - tcp://127.0.0.1:20100
Dealer monitoring event: CONNECTED - tcp://127.0.0.1:20100
Dealer monitoring event: DISCONNECTED - tcp://127.0.0.1:20100
Dealer monitoring event: CONNECT_RETRIED - tcp://127.0.0.1:20100
Dealer monitoring event: CONNECT_DELAYED - tcp://127.0.0.1:20100
Dealer monitoring event: CONNECTED - tcp://127.0.0.1:20100
Dealer monitoring event: DISCONNECTED - tcp://127.0.0.1:20100
Dealer monitoring event: CONNECT_RETRIED - tcp://127.0.0.1:20100
Dealer monitoring event: CONNECT_DELAYED - tcp://127.0.0.1:20100
Dealer monitoring event: CONNECTED - tcp://127.0.0.1:20100
Dealer monitoring event: DISCONNECTED - tcp://127.0.0.1:20100

And so on...

我很快尝试从跟踪 "cannot open client HELLO -- wrong server key"(参见 this file)中跟踪 ZMQ 的代码,但它看起来并不像那里是对握手失败的具体处理,或者我在代码中没有深入了解它...

有没有人已经遇到过这种情况并找到了如何知道我们使用的密钥好坏的方法? 对我来说,这些信息似乎很重要,但出于安全原因,ZMQ 可能没有提供这些信息?我真的不是安全专家...

编辑 2018-02-05:

该功能自 version 4.2.1 以来稳定且可用,仍在 API.

DRAFT 部分

参见the documentation

ZMQ_EVENT_HANDSHAKE_FAILED

The ZMTP security mechanism handshake failed. The event value is unspecified. NOTE: in DRAFT state, not yet available in stable releases.

ZMQ_EVENT_HANDSHAKE_SUCCEED

The ZMTP security mechanism handshake succeeded. The event value is unspecified. NOTE: in DRAFT state, not yet available in stable releases.


编辑 2017-01-01:

拉取请求已合并到 libzmq 的主分支中。 现在可以使用监控事件获取握手状态:

  • ZMQ_EVENT_HANDSHAKE_SUCCEED一旦加密握手成功
  • ZMQ_EVENT_HANDSHAKE_FAILED 失败时引发

但是这个特性还不稳定,你需要编译libzmq使用预处理器指令ZMQ_BUILD_DRAFT_API


原回答(2016-12-29):

目前没有适合此目的的功能。

libzmq github 上有一个开放的功能请求。