热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

前几天朋友让我帮忙部署一个mqtt服务器,要支持ssl加密的。初步了解了下mqtt协议是啥,然后选择了mosquitto搭建mqtt服务器。mqtt协议我就不多介绍了,百度谷歌一下一大堆资料。m

前几天朋友让我帮忙部署一个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
  1. 官网下载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
  1. 修改编译选项
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
  1. 接着安装lib-uuid
yum install libuuid-devel
  1. 安装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
  1. 最后开始编译安装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
  1. 复制配置文件和添加用户
    先添加配置文件
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
  1. 接下来要开启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协议

  1. 首先需要去签一个可信任的证书。目前腾讯云和阿里云都提供了免费证书申请。mosquitto配置ssl需要用到3个文件。
    • root.crt (根证书)
    • server.crt (我们自己的公钥根据根证书签的证书)
    • server.key (密钥)
  2. 获得这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库有关系。


推荐阅读
  • 兆芯X86 CPU架构的演进与现状(国产CPU系列)
    本文详细介绍了兆芯X86 CPU架构的发展历程,从公司成立背景到关键技术授权,再到具体芯片架构的演进,全面解析了兆芯在国产CPU领域的贡献与挑战。 ... [详细]
  • Linux下MySQL 8.0.28安装指南
    本文详细介绍了在Linux系统上安装MySQL 8.0.28的步骤,包括下载数据库、解压数据包、安装必要组件和启动MySQL服务。 ... [详细]
  • 用阿里云的免费 SSL 证书让网站从 HTTP 换成 HTTPS
    HTTP协议是不加密传输数据的,也就是用户跟你的网站之间传递数据有可能在途中被截获,破解传递的真实内容,所以使用不加密的HTTP的网站是不 ... [详细]
  • Python 数据可视化实战指南
    本文详细介绍如何使用 Python 进行数据可视化,涵盖从环境搭建到具体实例的全过程。 ... [详细]
  • Linux CentOS 7 安装PostgreSQL 9.5.17 (源码编译)
    近日需要将PostgreSQL数据库从Windows中迁移到Linux中,LinuxCentOS7安装PostgreSQL9.5.17安装过程特此记录。安装环境&#x ... [详细]
  • 在CentOS 7环境中安装配置Redis及使用Redis Desktop Manager连接时的注意事项与技巧
    在 CentOS 7 环境中安装和配置 Redis 时,需要注意一些关键步骤和最佳实践。本文详细介绍了从安装 Redis 到配置其基本参数的全过程,并提供了使用 Redis Desktop Manager 连接 Redis 服务器的技巧和注意事项。此外,还探讨了如何优化性能和确保数据安全,帮助用户在生产环境中高效地管理和使用 Redis。 ... [详细]
  • PHP 各版本对比:标准版与最新顶级版的详细分析 ... [详细]
  • 如何将TS文件转换为M3U8直播流:HLS与M3U8格式详解
    在视频传输领域,MP4虽然常见,但在直播场景中直接使用MP4格式存在诸多问题。例如,MP4文件的头部信息(如ftyp、moov)较大,导致初始加载时间较长,影响用户体验。相比之下,HLS(HTTP Live Streaming)协议及其M3U8格式更具优势。HLS通过将视频切分成多个小片段,并生成一个M3U8播放列表文件,实现低延迟和高稳定性。本文详细介绍了如何将TS文件转换为M3U8直播流,包括技术原理和具体操作步骤,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 服务器部署中的安全策略实践与优化
    服务器部署中的安全策略实践与优化 ... [详细]
  • 在 CentOS 7 系统中安装 Scrapy 时遇到了一些挑战。尽管 Scrapy 在 Ubuntu 上安装简便,但在 CentOS 7 上需要额外的配置和步骤。本文总结了常见问题及其解决方案,帮助用户顺利安装并使用 Scrapy 进行网络爬虫开发。 ... [详细]
  • Swoole加密机制的安全性分析与破解可能性探讨
    本文深入分析了Swoole框架的加密机制,探讨了其在实际应用中的安全性,并评估了潜在的破解可能性。研究结果表明,尽管Swoole的加密算法在大多数情况下能够提供有效的安全保护,但在特定场景下仍存在被攻击的风险。文章还提出了一些改进措施,以增强系统的整体安全性。 ... [详细]
  • Amoeba 通过优化 MySQL 的读写分离功能显著提升了数据库性能。作为一款基于 MySQL 协议的代理工具,Amoeba 能够高效地处理应用程序的请求,并根据预设的规则将 SQL 请求智能地分配到不同的数据库实例,从而实现负载均衡和高可用性。该方案不仅提高了系统的并发处理能力,还有效减少了主数据库的负担,确保了数据的一致性和可靠性。 ... [详细]
  • 在开发过程中,我最初也依赖于功能全面但操作繁琐的集成开发环境(IDE),如Borland Delphi 和 Microsoft Visual Studio。然而,随着对高效开发的追求,我逐渐转向了更加轻量级和灵活的工具组合。通过 CLIfe,我构建了一个高度定制化的开发环境,不仅提高了代码编写效率,还简化了项目管理流程。这一配置结合了多种强大的命令行工具和插件,使我在日常开发中能够更加得心应手。 ... [详细]
  • 在 CentOS 6.5 系统上部署 VNC 服务器的详细步骤与配置指南
    在 CentOS 6.5 系统上部署 VNC 服务器时,首先需要确认 VNC 服务是否已安装。通常情况下,VNC 服务默认未安装。可以通过运行特定的查询命令来检查其安装状态。如果查询结果为空,则表明 VNC 服务尚未安装,需进行手动安装。此外,建议在安装前确保系统的软件包管理器已更新至最新版本,以避免兼容性问题。 ... [详细]
  • 在JavaWeb项目架构中,NFS(网络文件系统)的实现与优化是关键环节。NFS允许不同主机系统通过局域网共享文件和目录,提高资源利用率和数据访问效率。本文详细探讨了NFS在JavaWeb项目中的应用,包括配置、性能优化及常见问题的解决方案,旨在为开发者提供实用的技术参考。 ... [详细]
author-avatar
mobiledu2502932307
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有