如何在 Go 中使用 SSL/TLS 证书实现 mqtt?

我正在尝试在 Go 中制作一个脚本,该脚本将使用 SSL/TLS 证书向 mqtt 代理发送消息。我使用 openSSL 创建了这些证书,并使用 mosquitto_sub 和 mosquitto_pub 命令测试了 mqtt 通信,这工作正常,但是当我尝试使用 Go 脚本发送消息时,出现以下错误:

网络错误:读取 tcp 192.168.1.243:59454->192.168.1.171:8883:读取:对端重置连接

并且在蚊子经纪人的日志中,出现以下消息:

1627682906:来自 192.168.1.243 端口 8883 的新连接。
1627682906:OpenSSL 错误:错误:1408F10B:SSL 例程:ssl3_get_record:版本号错误
1627682906:客户端套接字错误,断开连接。
1627682906:来自 192.168.1.243 端口 8883 上的新连接。
1627682906:OpenSSL 错误:错误:1408F10B:SSL 例程:ssl3_get_record:版本号错误
1627682906:客户端套接字错误,断开连接。

我使用的代码如下:

package main

import (
    "crypto/tls"
    "crypto/x509"
    "fmt"
    "io/ioutil"
    "log"

    MQTT "github.com/eclipse/paho.mqtt.golang" // mqtt
)

func main() {
    broker := "192.168.1.171"
    port := "8883"
    topic := "sensor/temperature"

    opts := MQTT.NewClientOptions()
    opts.AddBroker(fmt.Sprintf("tcp://%s:%s",broker,port))
    opts.SetClientID("Device")
    opts.Setusername("")
    opts.SetPassword("")
    tlsConfig := NewTlsConfig()
    opts.SetTLSConfig(tlsConfig)

    client := MQTT.NewClient(opts)
    if token := client.Connect(); token.Wait() && token.Error() != nil {
        log.Println("1. ",token.Error())
    }

    token := client.Publish(topic,false,"36.2")
    token.Wait()

    client.Disconnect(250)
}

func NewTlsConfig() *tls.Config {
    certpool := x509.NewCertPool()
    ca,err := ioutil.ReadFile("/home/pi/server.crt")
    if err != nil {
        log.Fatalln(err.Error())
    }
    certpool.AppendCertsFromPEM(ca)
    return &tls.Config{
        RootCAs: certpool,}
}

我的代码中是否有任何错误,或者是否有其他方法可以在 Go 中使用 SSL 证书实现 mqtt 通信?

super___1987cl 回答:如何在 Go 中使用 SSL/TLS 证书实现 mqtt?

我注意到的第一个问题是(这可能是唯一的问题,也可能还有其他问题):

opts.AddBroker(fmt.Sprintf("tcp://%s:%s",broker,port))

使用 url 方案 tcp(或 mqtt)表示您希望建立未加密的连接(您提供的证书将被忽略)。要通过 TLS 请求 MQTT,请使用 ssltlsmqttsmqtt+ssltcps 之一。例如 the demo(我怀疑您的代码基于它)使用:

opts.AddBroker("ssl://iot.eclipse.org:8883")

本文链接:https://www.f2er.com/7150.html

大家都在问