MQTT應用開發(一) - Artemis服務器搭建

物聯網的應用越來越廣泛了,而MQTT是物聯網的一個最常用的協議,在我的日常工作中也經常涉及到MQTT的應用,因此我打算在這一系列的博客中記錄一下一個完整的MQTT應用開發的過程。我的想法是以一個車聯網V2X的需求爲例子進行開發,這個需求是車輛定時上報其狀態信息(包括了位置,速度等),當車輛發生緊急情況(例如緊急剎車)時也將上報事件,後端的服務器接收車輛的事件,監測車輛的狀態。當車輛上報緊急狀況時進行相應的處理(例如把緊急剎車的事件轉發給一定範圍內的其他車輛)。車輛的數據上報和服務器的數據下發都是通過MQTT協議。

把這個應用的需求進行分解,可以看到有如下的工作:

  1. 搭建MQTT服務器
  2. 開發客戶端的車輛上報信息的應用
  3. 開發服務端的處理車輛數據的應用

搭建MQTT服務器

讓我們首先完成第一個工作,MQTT服務器的搭建。在業界有很多成熟的MQTT服務器軟件,例如ActiveMQ,RabbitMQ,Mosquito等等,看了網上的一些對比,我決定選用Apache的ActiveMQ Artemis來搭建我的MQTT服務器。這個軟件的優勢是開源,支持HA,支持高併發量。

服務器的安裝很簡單,在官網上下載之後解壓到一個目錄,然後在etc目錄下修改以下的設置:

在bootstrap.xml裏面,可以修改web bind的地址,這樣可以通過這個地址來訪問控制檯。另外還要修改jaas-security的設置,因爲我要設置通過SSL證書的方式來訪問,因此需要設置爲<jaas-security domain="PropertiesLogin" certificate-domain="CertLogin"/>

在login.config裏面,對應jaas-security設置以下的配置,指定用戶和角色配置文件的地址:

PropertiesLogin {
    org.apache.activemq.artemis.spi.core.security.jaas.PropertiesLoginModule required
        debug=true
        org.apache.activemq.jaas.properties.user="artemis-users.properties"
        org.apache.activemq.jaas.properties.role="artemis-roles.properties";
};

CertLogin {
   org.apache.activemq.artemis.spi.core.security.jaas.TextFileCertificateLoginModule required
       debug=true
       org.apache.activemq.jaas.textfiledn.user="cert-users.properties"
       org.apache.activemq.jaas.textfiledn.role="cert-roles.properties";
};

在etc目錄下新建1個文件cert-usrs.properites,定義用戶名和證書的subject DN之間的關係,例如添加以下的用戶:

vehicle1=CN=vehicle1, OU=VOLVO, O=VOLVO, L=GZ, ST=GD, C=CN

新建一個文件cert-roles.properties,定義用戶名和角色之間的關係,例如以下配置:

amq=vehicle1

在broker.xml文件裏面,要進行相應的SSL的設置,這個等完成SSL證書的簽發之後再進行設置。

SSL證書的簽發

要通過SSL來進行客戶身份的驗證以及通訊的加密,需要簽發相應的服務器端證書以及客戶端證書,具體的流程如下:

  1. openssl genrsa -out rootkey.pem 2048
    生成根證書的密匙
  2. openssl req -x509 -new -key rootkey.pem -out root.crt -subj="/C=CN/ST=GD/L=GZ/O=RootCA/OU=RootCA/CN=RootCA"
    生成X509格式根證書
  3. openssl genrsa -out clientkey.pem 2048
    生成客戶端的密匙
  4. openssl req -new -key clientkey.pem -out client.csr -subj="/C=CN/ST=GD/L=GZ/O=BMW/OU=Vehicle/CN=Vehicle1"
    生成客戶端證書的請求文件,請求根證書來簽發
  5. openssl x509 -req -in client.csr -CA root.crt -CAkey rootkey.pem -CAcreateserial -days 3650 -out client.crt
    用根證書來簽發客戶端請求文件,生成客戶端證書client.crt
  6. openssl genrsa -out serverkey.pem 2048
    生成服務器端的密匙
  7. openssl req -new -key serverkey.pem -out server.csr -subj="/C=CN/ST=GD/L=GZ/O=BMW/OU=IT/CN=Broker"
    生成服務器端證書的請求文件。請求根證書來簽發
  8. openssl x509 -req -in server.csr -CA root.crt -CAkey rootkey.pem -CAcreateserial -days 3650 -out server.crt
    用根證書來簽發服務器端請求文件,生成服務器端證書server.crt
  9. openssl pkcs12 -export -in client.crt -inkey clientkey.pem -out client.pkcs12
    打包客戶端資料爲pkcs12格式(client.pkcs12)
  10. openssl pkcs12 -export -in server.crt -inkey serverkey.pem -out server.pkcs12
    打包服務器端資料爲pkcs12格式(server.pkcs12 )
  11. keytool -importkeystore -srckeystore client.pkcs12 -destkeystore client.jks -srcstoretype pkcs12
    生成客戶端keystore(client.jks)。使用keytool的importkeystore指令。pkcs12轉jks。需要pkcs12密碼和jks密碼。
  12. keytool -importkeystore -srckeystore server.pkcs12 -destkeystore server.jks -srcstoretype pkcs12
    生成服務器端keystore(server.jks)。使用keytool的importkeystore指令。pkcs12轉jks。需要pkcs12密碼和jks密碼。
  13. keytool -importcert -keystore server.jks -file root.crt
    這一步不一定需要的。
  14. keytool -importcert -alias ca -file root.crt -keystore clienttrust.jks
    生成Client端的對外KeyStore,先把根證書放到裏面
  15. keytool -importcert -alias clientcert -file client.crt -keystore clienttrust.jks
    把Client證書加到對外KeyStore裏面
  16. keytool -importcert -alias ca -file root.crt -keystore servertrust.jks
    生成Server端的對外KeyStore,先把根證書放到裏面
  17. keytool -importcert -alias servercert -file server.crt -keystore servertrust.jks
    把Server證書加到對外KeyStore裏面

MQTT服務器設置

服務器和客戶端的SSL證書籤發完畢後,繼續進行MQTT服務器的設置。在Artemis安裝目錄的etc目錄下,編輯broker.xml文件,在<acceptor name="mqtt">的設置裏面,添加以下的配置:

<acceptor name="mqtt">tcp://0.0.0.0:8883?tcpSendBufferSize=1048576;tcpReceiveBufferSize=1048576;protocols=MQTT;useEpoll=true;sslEnabled=true;keyStorePath=/home/XXXX/server.jks;keyStorePassword=XXXX;needClientAuth=true;trustStorePath=/home/XXXX/clienttrust.jks;trustStorePassword=XXXX</acceptor>

現在可以啓動MQTT服務器了,在Artemis安裝目錄下,輸入bin/artemis run &

客戶端連接測試

現在我們可以測試一下連接服務器發送MQTT數據。這裏我選用MQTT.fx來進行測試,設置啓用SSL/TLS,協議選擇TLS V1.2,選擇self signed certificates,設置CA證書路徑以及客戶端證書和私鑰的路徑,然後即可連接。連接成功後,我們可以subscribe一個Topic,然後再往這個Topic Publish消息進行測試。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章