EMQX 集群使用 HAProxy 无法使用 SSL cn 作为 clientid

Hi.

HAProxy 支持使用 send-proxy-v2 配置传递 SSL 证书信息,如 cn 等参数,是否在后续的版本考虑将其也一并支持将 cn 等作为 clientid 而不仅在 TLS 连接中支持。

你把 emqx.conf 里,mqtt.peer_cert_as_clientid 设置为 cn 可以吗?

设置过了哈,

单节点使用 TLS 的时候没问题,集群(HAProxy)情况下就没办法。

那就很奇怪了,我知道你只要使用了 proxy protocol v2 (HAProxy 和 EMQX 的监听器都要设置),CN 就能传过来了,然后 peer_cert_as_clientid 配置就能生效。

是的,我测试了下,read-ip 能过来,但是 cn 就没办法提取出来

我刚才找了下 emqx 源码(但我不会 erlang…),关键字:pp2_ssl_cn,就在 ws 跟 ocpp gateway 这两个 listener 里边找到提取操作。

希望能提供一点思路。

哦 你用的 Websocket 吗?那可能没有的, TCP listener 有这个功能。

:joy:不是,是 WebSocket 里边有。

https://github.com/search?q=repo%3Aemqx%2Femqx%20pp2_ssl_cn&type=code

看到了,Websocket 和 TCP 都支持从 ProxyProtocol 读取 CN 的值,不清楚是哪儿发生了问题。

  • emqx 版本号是?
  • 抓一个包,看看握手后 ProxyProtocol 里字段都带过来了没有。
  • emqx 日志打开 debug,可能会有一些信息。

代码在这儿:

  1. esockd 获取 CN 的地方
    https://github.com/emqx/esockd/blob/5.11.1/src/esockd_peercert.erl#L37C1-L37C12

  2. emqx 调用 esockd 获取 CN 的地方:

https://github.com/emqx/emqx/blob/ea917d6b2ba6ae1236de559b64ac185bb3c50392/apps/emqx/src/emqx_channel.erl#L291

https://github.com/emqx/emqx/blob/ea917d6b2ba6ae1236de559b64ac185bb3c50392/apps/emqx/src/emqx_connection.erl#L332

Erlang VM 里生产环境安全地 trace 一个函数的办法:

  1. 首先进入 Erlang Shell:
emqx remote_console
  1. 执行 recon 的 trace 语句:
recon_trace:calls({esockd_peercert, common_name, fun(_) -> return_trace() end}, 5, [{scope, local}]).

上面的 trace 语句打印 5 次 esockd_peercert:common_name 函数的调用,然后自动停止 trace。

感谢支持。

我也看到了 issue 里边的一些 guideline,然后确实是我 HAProxy 的配置没写对,应使用 send-proxy-v2-ssl-cn 而不是单纯使用 send-proxy-v2。

抱歉没做好测试就提出这个问题。。

https://github.com/emqx/emqx/blob/v5.6.0/scripts/test/start-two-nodes-in-docker.sh#L170