• mqtt+ssl服务搭建以及ws+wss支持


    前几天朋友让我帮忙部署一个mqtt服务器,要支持ssl加密的。初步了解了下mqtt协议是啥,然后选择了mosquitto搭建mqtt服务器。mqtt协议我就不多介绍了,百度谷歌一下一大堆资料。mosquitto说白了就是mqtt协议的一个服务端实现。
    废话不多说,下面直接上我搭建的过程:

    一、 安装mosquitto 支持mqtt+ws
    操作系统:linux。本人用的是centos7。不过centos6.5也试过,也ok。
    1. 基础库安装

    yum install gcc-c++
    yum install cmake
    yum install openssl-devel //mosquitto默认支持openssl 
    官网下载mosquitto
    wget http://mosquitto.org/files/source/mosquitto-1.4.4.tar.gz
    tar -xzvf mosquitto-1.4.4.tar.gz
    cd mosquitto-1.4.4 
    修改编译选项
    vim config.mk 
    因为我们需要websocket支持,所以找到WITH_WEBSOCKETS将值设置为yes
    4. 别不急着编译mosquitto,先安装c-ares

    wget http://c-ares.haxx.se/download/c-ares-1.10.0.tar.gz
    tar xvf c-ares-1.10.0.tar.gz
    cd c-ares-1.10.0
    ./configure
    make
    make install 
    接着安装lib-uuid
    yum install libuuid-devel 
    安装libwebcoket
    wget https://github.com/warmcat/libwebsockets/archive/v1.3-chrome37-firefox30.tar.gz
    tar zxvf v1.3-chrome37-firefox30.tar.gz
    cd libwebsockets-1.3-chrome37-firefox30
    mkdir build; cd build;
    cmake .. -DLIB_SUFFIX=64
    make install 
    最后开始编译安装mosquitto
    make
    make install 
    最后程序会安装在 /etc/mosquitto 下面。
    8. 添加链接库路径
    由于操作系统版本及架构原因,很容易出现安装之后的链接库无法被找到,如启动mosquitto客户端可能出现找不到
    libmosquitto.so.1文件,因此需要添加链接库路径

    //添加路径
    vim /etc/ld.so.conf.d/liblocal.conf
    /usr/local/lib64
    /usr/local/lib

    //刷新
    ldconfig 
    复制配置文件和添加用户
    先添加配置文件
    mv /etc/mosquitto/mosquitto.conf.example /etc/mosquitto/mosquitto.conf 
    mosquitto默认以mosquitto用户启动,可以通过配置文件修改启动用户为root。

    vim /etc/mosquitto/mosquitto.conf
    user root 
    或者 也可以添加mosquitto 用户启动程序

    groupadd mosquitto
    useradd -g mosquitto mosquitto 
    接下来要开启websocket支持,我们需要修改配置文件
    vim /etc/mosquitto/mosquitto.conf 
    去掉port注释,并添加以下内容

    port 1883
    listener 8080
    protocol websockets 
    接着启动mosquitto

    mosquitto -c /etc/mosquitto/mosquitto.conf -d 
    这样,我们就同时开启了1883端口支持mqtt协议,8080端口支持websocket了。
    11. 测试
    - mqtt服务读者可以自行编写代码测试连通性。同时mosquitto 提供了 mosquitto_sub 和 mosquitto_pub 测试mqtt服务。
    - websocket 也可以编写js代码测试。或者去该网站测试 http://www.tongxinmao.com/txm/webmqtt.php

    二、加上ssl协议
    首先需要去签一个可信任的证书。目前腾讯云和阿里云都提供了免费证书申请。mosquitto配置ssl需要用到3个文件。
    root.crt (根证书)
    server.crt (我们自己的公钥根据根证书签的证书)
    server.key (密钥)
    获得这3个文件后,我们就可以配置mosquitto的ssl了。以下贴出主要的配置
    vim /etc/mosquitto/mosquitto.conf 
    port 1883

    listener 8883
    cafile /home/yangjb/apache/1_root_bundle.crt
    certfile /home/yangjb/apache/2_www.qilv.group.crt
    keyfile /home/yangjb/apache/3_www.qilv.group.key

    listener 8080
    protocol websockets

    listener 8081
    protocol websockets
    cafile /home/yangjb/apache/1_root_bundle.crt
    certfile /home/yangjb/apache/2_www.qilv.group.crt
    keyfile /home/yangjb/apache/3_www.qilv.group.key 
    配完重启mosquitto服务器就生效了
    - mqtt 协议走 1883端口
    - mqtt+ssl 走8883端口
    - websocket 协议走 8080端口
    - websocket+ssl 走8081端口

    三、 通过 nginx转发websockt
    我这边测试都通过了,但是朋友的小程序一直连不上websocket。(ws+wss都连不上)
    用微信自带的websocket库连接是可以的。但是他用的是Patho.Client库连接,就是死活连不上。
    后来网上找了半天,发现一篇文章。说禁用Sec-WebSocket-Protocol头就可以了。然后我配了下nginx,转发请求的时候去掉Sec-WebSocket-Protocol头,竟然真的可以了。也不知道什么原理- -。下面附上部分主要的配置

    location /mqtt {
    proxy_pass http://127.0.0.1:8080;
    proxy_set_header Sec-WebSocket-Protocol mqtt;
    # 这行就是去除 Sec-WebSocket-Protocol
    more_clear_headers Sec-WebSocket-Protocol;

    proxy_http_version 1.1;
    proxy_set_header Upgrade websocket;
    proxy_set_header Connection "upgrade";
    proxy_set_header X-real-ip $remote_addr;
    proxy_set_header X-Forwarded-For $remote_addr;

    上面的配置有个问题,就是我们正常的websockt反而连不上了。然后注解more_clear_headers Sec-WebSocket-Protocol;这行又连上了。但是同时朋友的小程序那边又连不上了。。。
    具体原因现在也没搞明白,想来可能和那个js库有关系。

     
    版权声明:本文为CSDN博主「疯狂哈丘」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/u013332124/article/details/79480639

  • 相关阅读:
    Codeforces Round #527 (Div. 3) B. Teams Forming
    Train Problem I (栈的基本运用)
    浙江中医药大学第十二届大学生程序设计竞赛 J. Jhadgre爬楼梯
    判断二进制半整数
    简易连连看
    Codeforces Round #527 (Div. 3) A. Uniform String
    求字符串中出现次数最多的字符 JAVA
    母猪的故事 (递推题)
    C#判断文件和文件夹是否存在 不存在则创建
    C# 数据库备份与还原 小妹做了一个winform系统,需要对sql2000数据库备份和还原(小妹妹你太狠了)
  • 原文地址:https://www.cnblogs.com/javalinux/p/14469757.html
Copyright © 2020-2023  润新知