ZMQ 加密:如何知道握手何时失败?
ZMQ encryption: how to know when the handshake failed?
上下文
- 我正在尝试使用 ZMQ 4.2.1 (this commit actually)
正确实施加密
- 我读了 Pieter Hintjens (here) 的一篇非常有趣的文章,他在文中描述了客户端和服务器之间的握手过程。
- 我有:
- 一个客户端,知道服务器的public密钥+它自己的密钥对
- 服务器,只知道自己的密钥对
用例
我想知道我的客户什么时候使用了错误的密钥(他知道的三个中的一个或多个是错误的)。
玩这个用例时,今天连接失败如预期但我无法知道连接失败是否因为加密握手失败。
注意:当我设置好密钥时,连接也正常
设置
服务器:
- 套接字:ZMQ_ROUTER,在 TCP 端点上绑定。
- Parameters:
- ZMQ_CURVE_SERVER = 1
- ZMQ_CURVE_SECRETKEY = 服务器私钥
- ZMQ_CURVE_PUBLICKEY = 服务器的public键
- A monitoring socket正在监听路由器套接字的事件。
客户:
- 套接字:ZMQ_DEALER,连接到服务器的 TCP 端点。
- Parameters:
- ZMQ_CURVE_SERVER = 0
- ZMQ_CURVE_SERVERKEY = 服务器的public密钥
- ZMQ_CURVE_SECRETKEY = 客户端私钥
- ZMQ_CURVE_PUBLICKEY = 客户端的public密钥
- 一个monitoring socket正在监听dealer socket的事件
行为
我 运行 我的服务器和客户端在两个简单的控制台应用程序中,客户端使用了错误的服务器公钥。
服务器监控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 部分
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 上有一个开放的功能请求。
上下文
- 我正在尝试使用 ZMQ 4.2.1 (this commit actually) 正确实施加密
- 我读了 Pieter Hintjens (here) 的一篇非常有趣的文章,他在文中描述了客户端和服务器之间的握手过程。
- 我有:
- 一个客户端,知道服务器的public密钥+它自己的密钥对
- 服务器,只知道自己的密钥对
用例
我想知道我的客户什么时候使用了错误的密钥(他知道的三个中的一个或多个是错误的)。
玩这个用例时,今天连接失败如预期但我无法知道连接失败是否因为加密握手失败。
注意:当我设置好密钥时,连接也正常
设置
服务器:
- 套接字:ZMQ_ROUTER,在 TCP 端点上绑定。
- Parameters:
- ZMQ_CURVE_SERVER = 1
- ZMQ_CURVE_SECRETKEY = 服务器私钥
- ZMQ_CURVE_PUBLICKEY = 服务器的public键
- A monitoring socket正在监听路由器套接字的事件。
客户:
- 套接字:ZMQ_DEALER,连接到服务器的 TCP 端点。
- Parameters:
- ZMQ_CURVE_SERVER = 0
- ZMQ_CURVE_SERVERKEY = 服务器的public密钥
- ZMQ_CURVE_SECRETKEY = 客户端私钥
- ZMQ_CURVE_PUBLICKEY = 客户端的public密钥
- 一个monitoring socket正在监听dealer socket的事件
行为
我 运行 我的服务器和客户端在两个简单的控制台应用程序中,客户端使用了错误的服务器公钥。
服务器监控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 部分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 上有一个开放的功能请求。