1. 程式人生 > >surgemq 添加ssl

surgemq 添加ssl

消息發布 以及 csr oot tcp ring 保持 int ddb

surgemq添加ssl
1.MQTT協議
消息發布訂閱功能的消息隊列協議
報文組成: 固定報頭(控制報文類型)+可變報頭(協議名稱、協議級別、連接標誌、保持連接)+有效載荷(clentId+will topic+will message +username + password )
協議級別QoS支持0,1,2
可以基於tcp和udp
2.surgemq
Surgemq采用了mqtt通信協議可以做Server和Client,項目裏主要用它做Server

Server每次和新的Client連接會創建一個新的對象叫Service

用來維護整個連接到關閉過程中服務端和這個客戶端的通信,處理消息的發布,訂閱
3.ssl(兩種方式) 利用自己生成的根證書分別給服務端(ca.crt,server.crt,server.key)和客戶端的證書簽名(ca.crt,client.crt,client.key) 只需要根證書對服務端和客戶端進行ssl驗證(ca.crt,ca.key) 3.1方式一: No.1 獲取服務器自簽名證書 獲取ca.crt
openssl genrsa -out ca.key 2048
openssl req -x509 -new -nodes -key ca.key -subj "/CN=*" -days 5000 -out ca.crt
獲取服務端證書和key
openssl genrsa -out
server.key 2048


server表示服務端ip,需要在測試服務器/etc/hosts配置添加 119.23.136.97 server openssl req -new -key server.key -subj "/CN=server" -out server.csr openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 5000
獲取客戶端證書
openssl genrsa -out client.key 2048

openssl req -new
-key client.key -subj "/CN=server" -out client.csr echo extendedKeyUsage=clientAuth > extfile.cnf openssl x509 -req -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -extfile extfile.cnf -out client.crt -days 5000

No.2服務端和客戶端使用證書雙向驗證

Surqmq server監聽端口方式改為tls.listen,tlsConfig加入服務端的證書和key以及根證書
//read crt and key``
certpool := x509.NewCertPool()
pemCerts, err := ioutil.ReadFile(ca)
if err != nil {
    fmt.Println(err)
    return err
}
certpool.AppendCertsFromPEM(pemCerts)
//server 端加入 tls
cert, err := tls.LoadX509KeyPair(crt, key)
if err != nil {
    fmt.Println(err)
    return err
}
config := &tls.Config{
    Certificates: []tls.Certificate{cert},
    ClientAuth:   tls.RequireAndVerifyClientCert,
    ClientCAs:    certpool,
}
this.ln, err = tls.Listen("tcp", u.Host, config)







Paho.mqtt client支持ssl方式的連接方式,tlsConfig加入客戶端的證書和key以及根證書

//
初始化tlsConfig func NewTLSConfig(ca, crt, key string) *tls.Config { certpool := x509.NewCertPool() pemCerts, err := ioutil.ReadFile(ca) if err == nil { certpool.AppendCertsFromPEM(pemCerts) } cert, err := tls.LoadX509KeyPair(crt, key) if err != nil { panic(err) } return &tls.Config{ RootCAs: certpool, Certificates: []tls.Certificate{cert}, } } //將給client設置tlsConfig connOpts.AddBroker(uri).SetTLSConfig(NewTLSConfig(ca, crt, key)) mc = MQTT.NewClient(connOpts)

3.2方式二:

No.1只需要獲取根證書server.crt和server.key
openssl genrsa -out server.key 2048
openssl req -x509 -new -nodes -key server.key -subj "/CN=server" -days 5000 -out server.crt

No.2服務端和客戶端使用根證書進行ssl驗證
//server 端加入 tls
cert, err := tls.LoadX509KeyPair(crt, key)
if err != nil {
    fmt.Println(err)
    return err
}
config := &tls.Config{
    Certificates: []tls.Certificate{cert},
    ClientAuth:   tls.NoClientCert,  //此處為tls.NoClientCert
}
this.ln, err = tls.Listen("tcp", u.Host, config)


func NewTLSConfig( crt, key string) *tls.Config {
// Import client certificate/key pair
certpool := x509.NewCertPool()
pemCerts, err := ioutil.ReadFile(crt)
if err == nil {
    certpool.AppendCertsFromPEM(pemCerts)
}
// Create tls.Config with desired tls properties
return &tls.Config{
    RootCAs:certpool,
}
}
//將給client設置tlsConfig
connOpts.AddBroker(uri).SetTLSConfig(NewTLSConfig(ca, crt, key))
mc = MQTT.NewClient(connOpts)



surgemq 添加ssl