使用证书认证忽略用户名密码

emqx版本5.0.21,我已经配置了mysql认证用户名密码,也开启了证书认证,但是我想如果MQTTX选择证书认证则不需要填写用户密码也能通过,我该如何进行相关配置

这是一个典型场景,现在 EMQX 支持的方式

  1. 使用 1883 端口接收一些非 TLS 的客户端,并使用基于 MySQL 的用户名密码认证
  2. 使用 8883 端口接收 TLS 的客户端,a) 并开启对客户端的证书的校验(为了保证客户端不是非法的,所以建议在 emqx 开启 SSL 的双向认证)。b) 并关闭对用户密码的校验

2.a 是有这俩项配置决定的

listeners.ssl.default.ssl_options.verify = "verify_peer"
listeners.ssl.default.ssl_options.fail_if_no_peer_cert = true

可以通过 Dashboard 直接开启,例如下面圈红的两项

2.b) 由这项配置决定:

listeners.ssl.default.enable_authn = false

暂未在 Dashboard 开放,只能通过 HTTP API (查看本地的 Swagger 更新监听器文档: http://127.0.0.1:18083/api-docs/index.html#/Listeners/put_listeners__id_) 或者配置文件来配置(官网配置文档:Configuration Manual | EMQX 5.0 Documentation)

或者用下面这个完整的 ssl 监听器,示例配置,放到 emqx.conf (如果是集群的话,需要更新每个节点这个配置)

listeners {
  ssl {
    default {
      acceptors = 16
      access_rules = ["allow all"]
      bind = "0.0.0.0:8883"
      ## 2.b)
      enable_authn = false
      enabled = true
      max_connections = "infinity"
      mountpoint = ""
      proxy_protocol = false
      proxy_protocol_timeout = "3s"
      ssl_options {
        cacertfile = "${EMQX_ETC_DIR}/certs/cacert.pem"
        certfile = "${EMQX_ETC_DIR}/certs/cert.pem"
        ciphers = []
        client_renegotiation = true
        depth = 10
        enable_crl_check = false
        ## 2.a)
        fail_if_no_peer_cert = true
        gc_after_handshake = false
        handshake_timeout = "15s"
        hibernate_after = "5s"
        honor_cipher_order = true
        keyfile = "${EMQX_ETC_DIR}/certs/key.pem"
        log_level = "notice"
        ocsp {
          enable_ocsp_stapling = false
          refresh_http_timeout = "15s"
          refresh_interval = "5m"
        }
        reuse_sessions = true
        secure_renegotiate = true
        ## 2.a)
        verify = "verify_peer"
        versions = ["tlsv1.3", "tlsv1.2"]
      }
      tcp_options {
        active_n = 100
        backlog = 1024
        buffer = "4KB"
        high_watermark = "1MB"
        keepalive = "none"
        nodelay = true
        reuseaddr = true
        send_timeout = "15s"
        send_timeout_close = true
      }
    }
  }