EMQX MQTT 服务配置 WSS 证书

发布时间: 2022-09-22 15:29:04 作者: 大象笔记

为何要配置 WSS 证书

原本用 EMQX 内置的 8083 端口,就可以实现 mqtt over websocket。

例如,地址:

ws://www.sunzhongwei.com:8083/mqtt

但是,由于我又需要在微信小程序里使用 mqtt over websocket,而微信小程序只允许使用 WSS 和 HTTPS 协议。所以不得不配置证书。

WSS 与 WS 的区别

WSS 全称是 Web Socket Secure, 即 WebSocket 的加密版本。类似与 HTTPS 之于 HTTP。

WSS 与 WS 类似于 HTTPS 和 HTTP,不同之处在于是不同的通信协议,都运行在 SSL(Secure Socket Layer,安全套接层)之上。即 TCP -> SSL -> WS / HTTP.

WSS 的默认端口

我看到 EMQX 官方文档里说:

由于微信小程序 BUG,安卓真机必须使用 TLS/443 端口,否则会连接失败(即连接地址不能带端口)

所以还是不要换端口的好,就用 443 端口。

Nginx 配置

EMQX 官方推荐使用 Nginx 来做反向代理。原理是:

WebSocket 协议和 HTTP 协议虽然不同,但是 WebSocket 协议的握手和HTTP 是兼容的,它使用 HTTP 的 Upgrade 协议头将连接从 HTTP 连接升级到 WebSocket 连接。这个特性使得 WebSocket 应用程序可以很容易地应用到现有的基础设施.

因为,本身我的域名 www.sunzhongwei.com 已经通过 letsencrypt cerbot 安装了 HTTPS 证书。所以,只需要在 443 端口下加个转发规则即可:

server {
    listen  443 ssl;        
    # ... 省略

    # 添加反向代理
    location /mqtt {
      proxy_pass http://127.0.0.1:8083/mqtt;
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      # client_max_body_size 35m;
      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection "upgrade";    
    }
}

重新加载 Nginx 配置即可:

$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
$ sudo nginx -s reload

参考

我是一名山东烟台的开发者,联系作者