簡介
- 整合資料庫使用者帳號認證
- ACL - 針對使用者設定不同的主題存取權限
- 支持 SSL
- 支持 WebSocket
--
安裝
1 2 3 |
# wget https://www.emqx.io/cn/downloads/broker/v4.2.2/emqx-ubuntu20.04-4.2.2-x86_64.deb # dpkg -i emqx-ubuntu20.04-4.2.2-x86_64.deb # emqx start |
管理介面
1 |
http://ip:18083 |
帳號 admin 密碼 public
修改預設 Dashboard 密碼,編輯 /etc/emqx/plugins/emqx_dashboard.conf
1 2 |
dashboard.default_user.login = admin dashboard.default_user.password = public |
修改完成後重啟即可
1 |
# emqx restart |
--
SSL - 證書生成
不適用跨到 WebSocket 應用,需要跨接到 WebSocket 時,請參考「MQTT – 使用 Let’s Encrypt SSL + EMQ X 建構 SSL WebSocket」
1 2 |
# openssl genrsa -out my_root_ca.key 2048 # openssl req -x509 -new -nodes -key my_root_ca.key -sha256 -days 3650 -out my_root_ca.pem |
編輯 openssl.cnf 設定檔
1 |
# vi openssl.cnf |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
[req] default_bits = 2048 distinguished_name = req_distinguished_name req_extensions = req_ext x509_extensions = v3_req prompt = no [req_distinguished_name] countryName = TW stateOrProvinceName = hoyo localityName = hoyo organizationName = EMQX commonName = *.*.*.* [req_ext] subjectAltName = @alt_names [v3_req] subjectAltName = @alt_names [alt_names] IP.1 = 172.16.1.220 |
- IP 不能使用 * (萬用字元 wildcard) ;DNS 可以
- commonName 使用 *.*.*.* 來應付 IP 連接環境
1 2 3 4 5 6 |
# openssl genrsa -out emqx.key 2048 # openssl req -new -key ./emqx.key -config openssl.cnf -out emqx.csr # openssl x509 -req -in ./emqx.csr -CA my_root_ca.pem -CAkey my_root_ca.key -CAcreateserial -out emqx.pem -days 3650 -sha256 -extensions v3_req -extfile openssl.cnf # openssl genrsa -out client.key 2048 # openssl req -new -key client.key -out client.csr -subj "/C=TW/ST=hoyo/L=hoyo/O=EMQX/CN=client" # openssl x509 -req -days 3650 -in client.csr -CA my_root_ca.pem -CAkey my_root_ca.key -CAcreateserial -out client.pem |
結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
root@demand:~/emqx_ssl# ll total 48 drwxr-xr-x 2 root root 4096 Nov 18 01:59 ./ drwx------ 12 root root 4096 Nov 20 09:42 ../ -rw-r--r-- 1 root root 964 Nov 18 01:59 client.csr -rw------- 1 root root 1679 Nov 18 01:59 client.key -rw-r--r-- 1 root root 1155 Nov 18 01:59 client.pem -rw-r--r-- 1 root root 1005 Nov 18 01:58 emqx.csr -rw------- 1 root root 1675 Nov 18 01:50 emqx.key -rw-r--r-- 1 root root 1188 Nov 18 01:58 emqx.pem -rw------- 1 root root 1679 Nov 18 01:49 my_root_ca.key -rw-r--r-- 1 root root 1294 Nov 18 01:50 my_root_ca.pem -rw-r--r-- 1 root root 41 Nov 18 01:59 my_root_ca.srl -rw-r--r-- 1 root root 372 Nov 18 01:58 openssl.cnf |
編輯
1 |
# vi /etc/emqx/emqx.conf |
1 2 3 |
listener.ssl.external.keyfile = /etc/emqx/certs/emqx.key listener.ssl.external.certfile = /etc/emqx/certs/emqx.pem listener.ssl.external.cacertfile = /etc/emqx/certs/my_root_ca.pem |
--
證書指紋
1 |
# openssl x509 -in emqx.pem -noout -fingerprint -sha1 |
--
MySQL 使用者認證
編輯資料庫連接設定檔
1 |
# vi /etc/emqx/plugins/emqx_auth_mysql.conf |
1 2 3 4 |
auth.mysql.server = 127.0.0.1:3306 auth.mysql.username = username auth.mysql.password = password auth.mysql.database = database |
重啟 emqx
1 |
# emqx restart |
建立 user 資料表
1 2 3 4 5 6 7 8 9 10 |
CREATE TABLE `mqtt_user` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `username` varchar(100) DEFAULT NULL, `password` varchar(100) DEFAULT NULL, `salt` varchar(35) DEFAULT NULL, `is_superuser` tinyint(1) DEFAULT 0, `created` datetime DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `mqtt_username` (`username`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; |
建立 ACL 資料表
1 2 3 4 5 6 7 8 9 10 |
CREATE TABLE `mqtt_acl` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `allow` int(1) DEFAULT 1 COMMENT '0: deny, 1: allow', `ipaddr` varchar(60) DEFAULT NULL COMMENT 'IpAddress', `username` varchar(100) DEFAULT NULL COMMENT 'Username', `clientid` varchar(100) DEFAULT NULL COMMENT 'ClientId', `access` int(2) NOT NULL COMMENT '1: subscribe, 2: publish, 3: pubsub', `topic` varchar(100) NOT NULL DEFAULT '' COMMENT 'Topic Filter', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; |
到 Dashboard 開啟 emqx_auth_mysql 插件
--
白名單
實際應用上不可能讓每個使用者都無限制的訂閱主題,因此必須使用白名單機制
1 |
# vi /etc/emqx/ |
將預設允許訪客關閉
1 2 |
allow_anonymous = false acl_nomatch = allow |
user 資料表新增帳號,ACL 新增允許的主題,類似以下這個樣子
--
4,129 total views, 2 views today