请问mosqutto服务器 8883端口,绑定多个ssl证书吗?
离线
查了一下,mosqutto做不到,只能用其他办法做到:
方法一:使用 SNI(Server Name Indication)与代理服务器
最常用的方法是利用反向代理服务器(如 Nginx、HAProxy 或 Apache)来实现 SNI。SNI 允许在同一个 IP 地址和端口上运行多个 HTTPS 服务,每个服务有其独立的 SSL 证书。你可以在代理服务器上配置多个虚拟主机,每个虚拟主机都有自己的 SSL 证书。然后,代理服务器将连接转交给后端的 Mosquitto 服务器。
Nginx 示例配置:
server {
listen 8883 ssl;
server_name example1.com;
ssl_certificate /etc/nginx/ssl/example1.com.crt;
ssl_certificate_key /etc/nginx/ssl/example1.com.key;
proxy_pass mosquitto://localhost:8883;
}
server {
listen 8883 ssl;
server_name example2.com;
ssl_certificate /etc/nginx/ssl/example2.com.crt;
ssl_certificate_key /etc/nginx/ssl/example2.com.key;
proxy_pass mosquitto://localhost:8883;
}
在上述配置中,Nginx 监听 8883 端口,接收来自不同域名的 SSL 连接,并基于 SNI 选择正确的 SSL 证书。然后,Nginx 将解密后的连接转发给 Mosquitto 的 8883 端口。
方法二:使用 Mosquitto 多实例
另一种可能的方法是运行多个 Mosquitto 实例,每个实例监听不同的端口,但这些端口需要映射到同一公共端口(如 8883)。这可以通过在服务器上使用 iptables 或类似工具进行端口转发来实现。然而,这种方法可能增加管理和维护的复杂性,因为它涉及到管理多个 Mosquitto 实例及其各自的 SSL 证书。
离线
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>mqtt.min.js 测试</title>
<style>
.divblock {
display: inline-block;
padding: 20px;
border: 2px solid #00ff00;
border-radius: 6px;
margin: 20px 0px;
user-select: none;
}
.divblock:active {
background-color: #455072;
border: 1px solid #0044ff;
}
</style>
<script src="https://unpkg.com/mqtt/dist/mqtt.min.js"></script> <!-- 引处MQTT.MINI.JS库文件 -->
</head>
<body>
<div>4路开关模块</div>
<div class="divblock" onclick="Onmqtttest()">mqtt 发送</div>
</body>
<script>
// Create a client instance
var options = {
//mqtt客户端的id,这里面应该还可以加上其他参数,具体看官方文档
clientId: 'mqttjs_' + (Math.random() * 1000000).toString(),
username: "player",
password: "player",
reconnectPeriod: 1000, // 1000毫秒,设置为 0 禁用自动重连,两次重新连接之间的间隔时间
connectTimeout: 30 * 1000, // 30秒,连接超时时间
}
//console.log(options.clientId);
//浏览器采用websocket协议,host主机地址为192.168.0.200,端口为9001,路径为/mqtt
var client = mqtt.connect("wss://player2.mqtt.memory.com:8084/", options) // you add a ws:// url here
//建立连接
client.on('connect', function () {
console.log("connect success!")
//订阅主题 /topic/player
client.subscribe('/topic/player', function (err) {
if (!err) {
console.log("subscribe success!")
} else {
//打印错误
console.log(err)
}
})
})
//如果连接错误,打印错误
client.on('error', function (err) {
console.log(err)
client.end()
})
//如果client订阅主题成功,那么这里就是当接收到自己订阅主题的处理逻辑
client.on('message', function (topic, message) {
// message is Buffer,此处就是打印消息的具体内容
console.log('-> ' + message.toString())
})
// 用户程序点击事件
function Onmqtttest() {
message = "message from browser with websocket"; // 消息内容
//发布主题presence,消息内容为Hello mqtt,订阅与推送一样自发自收
client.publish('/topic/player', 'Hello mqtt ' + message)
}
</script>
</html>
再来一个简单的浏览器版本的 MQTT测试demo
离线
mqtt我不熟悉,但时要用sni用到的是websocket在emqx上的默认端口是8083 8084,在前面加Nginx反代一下长连就行。也就是#1的内容
离线