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

时间:2016-12-29 13:21:04

标签: security networking encryption zeromq

上下文

  • 我正在尝试使用ZMQ 4.2.1this commit actually
  • 正确实施加密
  • 我阅读了Pieter Hintjens(here)中非常有趣的文章,其中描述了客户端和服务器之间的握手过程。
  • 我有:
    • 一个客户端,他知道服务器的公钥+自己的密钥对
    • 服务器,只知道自己的密钥对

用例

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

在播放此用例时,今天连接失败按预期但由于加密握手失败,我无法知道连接是否失败。

Nb。:当我设置好键时,连接也可以正常工作

设置

服务器:

  • 套接字:ZMQ_ROUTER在TCP端点上绑定
  • Parameters
    • ZMQ_CURVE_SERVER = 1
    • ZMQ_CURVE_SECRETKEY =服务器的私钥
    • ZMQ_CURVE_PUBLICKEY =服务器的公钥
  • monitoring socket正在侦听路由器套接字的事件。

客户:

  • 套接字:ZMQ_DEALER连接到服务器的TCP端点。
  • Parameters
    • ZMQ_CURVE_SERVER = 0
    • ZMQ_CURVE_SERVERKEY =服务器的公钥
    • ZMQ_CURVE_SECRETKEY =客户的私钥
    • ZMQ_CURVE_PUBLICKEY =客户的公钥
  • monitoring socket正在收听经销商插座的事件。

行为

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

以下是服务器监控套接字的日志跟踪:

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...

我很快就尝试从跟踪&#34中跟踪ZMQ的代码;无法打开客户端HELLO - 错误的服务器密钥" (请参阅this file),但它看起来没有针对握手的特定处理失败,或者我在代码中没有走得太远以找到它...

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

1 个答案:

答案 0 :(得分:2)

编辑2018-02-05:

该功能自version 4.2.1起稳定可用,仍然位于API的 DRAFT 部分。

请参阅the documentation

  

<强> ZMQ_EVENT_HANDSHAKE_FAILED

     

ZMTP安全机制握手失败。事件值未指定。注意:在DRAFT状态下,尚未在稳定版本中提供。

     

<强> ZMQ_EVENT_HANDSHAKE_SUCCEED

     

ZMTP安全机制握手成功。事件值未指定。注意:在DRAFT状态下,尚未在稳定版本中提供。

编辑2017-01-01:

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

    一旦加密握手成功,就会引发
  • ZMQ_EVENT_HANDSHAKE_SUCCEED
  • ZMQ_EVENT_HANDSHAKE_FAILED在失败时被提出

但是此功能仍然不稳定,您需要使用预处理器指令libzmq编译ZMQ_BUILD_DRAFT_API

原始答案(2016-12-29):

目前没有适当的功能。

libzmq github上有一项未公开的功能请求。