emqx版本5.0.21,我已经配置了mysql认证用户名密码,也开启了证书认证,但是我想如果MQTTX选择证书认证则不需要填写用户密码也能通过,我该如何进行相关配置
这是一个典型场景,现在 EMQX 支持的方式
- 使用 1883 端口接收一些非 TLS 的客户端,并使用基于 MySQL 的用户名密码认证
- 使用 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
}
}
}