我正在尝试在 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 通信?