Activemq 使用ssl說明


1、  使用java的keytool工具生成證書文件

  

keytool -genkey -alias michaelkey -keyalg RSA -keysize 1024 -keypass hzfpwd -validity 365 -keystore e:\ssl\my.ks -storepass hzfpwd

 

  參數說明看下幫助,我這個是照着寫的,keypass和storepass 我設成一樣的了,keystore為文件存儲位置。

2、  將文件拷貝到activemq目錄的conf文件夾下。

3、  修改activemq/conf目錄下的activemq.xml,加入

  

<transportConnector name="mqtt+nio" uri="mqtt+nio+ssl://0.0.0.0:1883?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>

  

復制代碼
<sslContext>
          <sslContext keyStore="file:${activemq.base}/conf/my.ks"
                      keyStorePassword="hzfpwd"
                      trustStore="file:${activemq.base}/conf/my.ks"
                      trustStorePassword="hzfpwd"
                      />
    </sslContext>
復制代碼

4、  啟動服務,服務器端ssl就ok了。

5、  客戶端ssl

我直接考代碼了:

復制代碼
package com.via.im.test;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URISyntaxException;
import java.net.URL;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.security.GeneralSecurityException;
import java.security.KeyStore;

import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManagerFactory;

/**
 * 獲取sslcontext
 * @author han.zhifeng
 *
 */
public class MqttSslTest {
    /**
     * 獲取sslcontext
     * @return
     */
    public static SSLContext getSSLContext() {
        final char[] JKS_PASSWORD = "hzfpwd".toCharArray();
        final char[] KEY_PASSWORD = "hzfpwd".toCharArray();
        try {
            /* Get the JKS contents */
            final KeyStore keyStore = KeyStore.getInstance("JKS");
            try (final InputStream is = new FileInputStream(
                    fullPathOfKeyStore())) {
                keyStore.load(is, JKS_PASSWORD);
            }
            final KeyManagerFactory kmf = KeyManagerFactory
                    .getInstance(KeyManagerFactory.getDefaultAlgorithm());
            kmf.init(keyStore, KEY_PASSWORD);
            final TrustManagerFactory tmf = TrustManagerFactory
                    .getInstance(TrustManagerFactory.getDefaultAlgorithm());
            tmf.init(keyStore);

            /*
             * Creates a socket factory for HttpsURLConnection using JKS
             * contents
             */
            final SSLContext sc = SSLContext.getInstance("TLS");
            sc.init(kmf.getKeyManagers(), tmf.getTrustManagers(),
                    new java.security.SecureRandom());
//            final SSLSocketFactory socketFactory = sc.getSocketFactory();
//            HttpsURLConnection.setDefaultSSLSocketFactory(socketFactory);
            return sc;
        } catch (final GeneralSecurityException | IOException exc) {
            throw new RuntimeException(exc);
        }
    }

    /**
     * 證書
     * @return
     */
    private static String fullPathOfKeyStore() {
        final String JKS_RESOURCE_PATH = "/ssl/my.ks";
        final URL url = MqttSslTest.class.getResource(JKS_RESOURCE_PATH);
        try {
            final Path path = Paths.get(url.toURI());
            return path.toAbsolutePath().toString();

        } catch (final URISyntaxException exc) {
            throw new RuntimeException(exc);
        }
    }

}
復制代碼

Mqtt客戶端設置一下就ok了。

復制代碼
     MQTT mqtt = new MQTT();
        mqtt.setHost("ssl://192.168.254.128:1883");
        mqtt.setClientId("hanzhifeng-8"); // 用於設置客戶端會話的ID。在setCleanSession(false);被調用時,MQTT服務器利用該ID獲得相應的會話。此ID應少於23個字符,默認根據本機地址、端口和時間自動生成
        mqtt.setCleanSession(false); // 若設為false,MQTT服務器將持久化客戶端會話的主體訂閱和ACK位置,默認為true
        mqtt.setKeepAlive((short) 60);// 定義客戶端傳來消息的最大時間間隔秒數,服務器可以據此判斷與客戶端的連接是否已經斷開,從而避免TCP/IP超時的長時間等待
        mqtt.setUserName("test");// 服務器認證用戶名
        mqtt.setPassword("test");// 服務器認證密碼

        mqtt.setWillTopic("willTopic");// 設置“遺囑”消息的話題,若客戶端與服務器之間的連接意外中斷,服務器將發布客戶端的“遺囑”消息
        mqtt.setWillMessage("willMessage");// 設置“遺囑”消息的內容,默認是長度為零的消息
        mqtt.setWillQos(QoS.AT_LEAST_ONCE);// 設置“遺囑”消息的QoS,默認為QoS.ATMOSTONCE
        mqtt.setWillRetain(true);// 若想要在發布“遺囑”消息時擁有retain選項,則為true
        mqtt.setVersion("3.1.1");

        // 失敗重連接設置說明
        mqtt.setConnectAttemptsMax(10L);// 客戶端首次連接到服務器時,連接的最大重試次數,超出該次數客戶端將返回錯誤。-1意為無重試上限,默認為-1
        mqtt.setReconnectAttemptsMax(3L);// 客戶端已經連接到服務器,但因某種原因連接斷開時的最大重試次數,超出該次數客戶端將返回錯誤。-1意為無重試上限,默認為-1
        mqtt.setReconnectDelay(10L);// 首次重連接間隔毫秒數,默認為10ms
        mqtt.setReconnectDelayMax(30000L);// 重連接間隔毫秒數,默認為30000ms
        mqtt.setReconnectBackOffMultiplier(2);// 設置重連接指數回歸。設置為1則停用指數回歸,默認為2

        // Socket設置說明
        mqtt.setReceiveBufferSize(65536);// 設置socket接收緩沖區大小,默認為65536(64k)
        mqtt.setSendBufferSize(65536);// 設置socket發送緩沖區大小,默認為65536(64k)
        mqtt.setTrafficClass(8);// 設置發送數據包頭的流量類型或服務類型字段,默認為8,意為吞吐量最大化傳輸

        // 帶寬限制設置說明
        mqtt.setMaxReadRate(0);// 設置連接的最大接收速率,單位為bytes/s。默認為0,即無限制
        mqtt.setMaxWriteRate(0);// 設置連接的最大發送速率,單位為bytes/s。默認為0,即無限制
        

        mqtt.setSslContext(MqttSslTest.getSSLContext());//設置ssl
復制代碼

ok,完事了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM