【问题标题】:ZMQ encryption: how to know when the handshake failed?ZMQ 加密:如何知道握手失败的时间?
【发布时间】:2016-12-29 13:21:04
【问题描述】:

上下文

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

用例

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

玩这个用例时,今天连接失败不出所料,但我无法知道连接是否因为加密握手失败而失败。

注意:当我设置好的键时,连接也正常

设置

服务器:

  • 套接字: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 正在侦听庄家套接字的事件。

行为

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

这里是服务器监控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...

这里是客户端监控socket的日志跟踪:

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

我很快尝试从跟踪中跟踪 ZMQ 的代码 “无法打开客户端 HELLO -- 错误的服务器密钥”(请参阅 this file),但看起来没有握手的特定处理失败,或者我在代码中没有走得足够远......

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

【问题讨论】:

    标签: security networking encryption zeromq


    【解决方案1】:

    编辑 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 在失败时引发

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


    原答案(2016-12-29):

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-28
      • 2017-06-19
      • 2023-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多