EMQX MQTT 服务配置 WSS 证书

文章目录

    为何要配置 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 的默认端口

    • WS 的默认端口是 80。跟 HTTP 相同。
    • WSS 的默认端口是 443。跟 HTTPS 相同。

    我看到 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
    

    参考

    • https://blog.csdn.net/zl18603543572/article/details/122280758
    • https://docs.emqx.com/zh/enterprise/v4.4/development/wechat-miniprogram.html

    关于作者 🌱

    我是来自山东烟台的一名开发者,有感兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊,或者关注我的个人公众号“大象工具”, 查看更多联系方式