国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

EMQX啟用雙向SSL/TLS安全連接以及java連接

這篇具有很好參考價值的文章主要介紹了EMQX啟用雙向SSL/TLS安全連接以及java連接。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

作為基于現(xiàn)代密碼學公鑰算法的安全協(xié)議,TLS/SSL 能在計算機通訊網(wǎng)絡(luò)上保證傳輸安全,EMQX 內(nèi)置對 TLS/SSL 的支持,包括支持單/雙向認證、X.509 證書、負載均衡 SSL 等多種安全認證。你可以為 EMQX 支持的所有協(xié)議啟用 SSL/TLS,也可以將 EMQX 提供的 HTTP API 配置為使用 TLS。

SSL/TLS 帶來的安全優(yōu)勢

  • 強認證。?用 TLS 建立連接的時候,通訊雙方可以互相檢查對方的身份。在實踐中,很常見的一種身份檢查方式是檢查對方持有的 X.509 數(shù)字證書。這樣的數(shù)字證書通常是由一個受信機構(gòu)頒發(fā)的,不可偽造。

  • 保證機密性。TLS 通訊的每次會話都會由會話密鑰加密,會話密鑰由通訊雙方協(xié)商產(chǎn)生。任何第三方都無法知曉通訊內(nèi)容。即使一次會話的密鑰泄露,并不影響其他會話的安全性。

  • 完整性。?加密通訊中的數(shù)據(jù)很難被篡改而不被發(fā)現(xiàn)。

SSL/TLS 協(xié)議

TLS/SSL 協(xié)議下的通訊過程分為兩部分,第一部分是握手協(xié)議。握手協(xié)議的目的是鑒別對方身份并建立一個安全的通訊通道。握手完成之后雙方會協(xié)商出接下來使用的密碼套件和會話密鑰;第二部分是 record 協(xié)議,record 和其他數(shù)據(jù)傳輸協(xié)議非常類似,會攜帶內(nèi)容類型,版本,長度和荷載等信息,不同的是它所攜帶的信息是加密了的。

下面的圖片描述了 TLS/SSL 握手協(xié)議的過程,從客戶端的 "hello" 一直到服務(wù)器的 "finished" 完成握手。有興趣的同學可以找更詳細的資料看。對這個過程不了解也并不影響我們在?EMQX?中啟用這個功能。

EMQX啟用雙向SSL/TLS安全連接以及java連接,ssl,安全,網(wǎng)絡(luò)

為什么需要 SSL/TLS 雙向認證

雙向認證是指,在進行通信認證時要求服務(wù)端和客戶端都需要證書,雙方都要進行身份認證,以確保通信中涉及的雙方都是受信任的。 雙方彼此共享其公共證書,然后基于該證書執(zhí)行驗證、確認。一些對安全性要求較高的應用場景,就需要開啟雙向 SSL/TLS 認證。

SSL/TLS 證書準備

在雙向認證中,一般都使用自簽名證書的方式來生成服務(wù)端和客戶端證書,因此本文就以自簽名證書為例。

通常來說,我們需要數(shù)字證書來保證 TLS 通訊的強認證。數(shù)字證書的使用本身是一個三方協(xié)議,除了通訊雙方,還有一個頒發(fā)證書的受信第三方,有時候這個受信第三方就是一個 CA。和 CA 的通訊,一般是以預先發(fā)行證書的方式進行的。也就是在開始 TLS 通訊的時候,我們需要至少有 2 個證書,一個 CA 的,一個 EMQX 的,EMQX 的證書由 CA 頒發(fā),并用 CA 的證書驗證。

在這里,我們假設(shè)您的系統(tǒng)已經(jīng)安裝了 OpenSSL。使用 OpenSSL 附帶的工具集就可以生成我們需要的證書了。

生成自簽名 CA 證書

首先,我們需要一個自簽名的 CA 證書。生成這個證書需要有一個私鑰為它簽名,可以執(zhí)行以下命令來生成私鑰:

openssl genrsa -out ca.key 2048

?這個命令將生成一個密鑰長度為 2048 的密鑰并保存在?ca.key?中。有了這個密鑰,就可以用它來生成 EMQX 的根證書了:

openssl req -x509 -new -nodes -key ca.key -sha256 -days 3650 -out ca.pem

根證書是整個信任鏈的起點,如果一個證書的每一級簽發(fā)者向上一直到根證書都是可信的,那個我們就可以認為這個證書也是可信的。有了這個根證書,我們就可以用它來給其他實體簽發(fā)實體證書了。

生成服務(wù)端證書

實體(在這里指的是 EMQX)也需要一個自己的私鑰對來保證它對自己證書的控制權(quán)。生成這個密鑰的過程和上面類似:

openssl genrsa -out emqx.key 2048

新建?openssl.cnf?文件,

  • req_distinguished_name :根據(jù)情況進行修改,

  • alt_names:?BROKER_ADDRESS?修改為 EMQX 服務(wù)器實際的 IP 或 DNS 地址,例如:IP.1 = 127.0.0.1,或 DNS.1 = broker.xxx.com

注意:IP 和 DNS 二者保留其一即可,如果已購買域名,只需保留 DNS 并修改為你所使用的域名地址

[req]default_bits  = 2048
distinguished_name = req_distinguished_name
req_extensions = req_ext
x509_extensions = v3_req
prompt = no
[req_distinguished_name]
countryName = CN
stateOrProvinceName = Zhejiang
localityName = Hangzhou
organizationName = EMQX
commonName = CA
[req_ext]
subjectAltName = @alt_names
[v3_req]
subjectAltName = @alt_names
[alt_names]
IP.1 = BROKER_ADDRESS
DNS.1 = BROKER_ADDRESS

然后以這個密鑰和配置簽發(fā)一個證書請求:

openssl req -new -key ./emqx.key -config openssl.cnf -out emqx.csr

然后以根證書來簽發(fā) EMQX 的實體證書:

openssl x509 -req -in ./emqx.csr -CA ca.pem -CAkey ca.key -CAcreateserial -out emqx.pem -days 3650 -sha256 -extensions v3_req -extfile openssl.cnf

生成客戶端證書

雙向連接認證還需要創(chuàng)建客戶端證書,首先需要創(chuàng)建客戶端密鑰:

openssl genrsa -out client.key 2048

使用生成的客戶端密鑰來創(chuàng)建一個客戶端請求文件:

openssl req -new -key client.key -out client.csr -subj "/C=CN/ST=Zhejiang/L=Hangzhou/O=EMQX/CN=client"

最后使用先前生成好的服務(wù)端 CA 證書來給客戶端簽名,生成一個客戶端證書:

openssl x509 -req -days 3650 -in client.csr -CA ca.pem -CAkey ca.key -CAcreateserial -out client.pem

準備好服務(wù)端和客戶端證書后,我們就可以在 EMQX 中啟用 TLS/SSL 雙向認證功能。

SSL/TLS 雙向連接的啟用及驗證

在 EMQX 中?mqtt:ssl?的默認監(jiān)聽端口為 8883。

EMQX 配置

將前文中通過 OpenSSL 工具生成的?emqx.pem、emqx.key?及?ca.pem?文件拷貝到 EMQX 的?etc/certs/?目錄下,并參考如下配置修改?emqx.conf

## listener.ssl.$name is the IP address and port that the MQTT/SSL
## Value: IP:Port | Port
listener.ssl.external = 8883
 
## Path to the file containing the user's private PEM-encoded key.
## Value: File
listener.ssl.external.keyfile = etc/certs/emqx.key
 
## 注意:如果 emqx.pem 是證書鏈,請確保第一個證書是服務(wù)器的證書,而不是 CA 證書。
## Path to a file containing the user certificate.
## Value: File
listener.ssl.external.certfile = etc/certs/emqx.pem
 
## 注意:ca.pem 用于保存服務(wù)器的中間 CA 證書和根 CA 證書。可以附加其他受信任的 CA,用來進行客戶端證書驗證。
## Path to the file containing PEM-encoded CA certificates. The CA certificates
## Value: File
listener.ssl.external.cacertfile = etc/certs/ca.pem
 
## A server only does x509-path validation in mode verify_peer,
## as it then sends a certificate request to the client (this
## message is not sent if the verify option is verify_none).
##
## Value: verify_peer | verify_none
listener.ssl.external.verify = verify_peer
 
## Used together with {verify, verify_peer} by an SSL server. If set to true,
## the server fails if the client does not have a certificate to send, that is,
## sends an empty certificate.
##
## Value: true | false
listener.ssl.external.fail_if_no_peer_cert = true

創(chuàng)建 MQTT 連接

添加以下依賴到項目 pom.xml 文件中。


   <dependency>
       <groupId>org.eclipse.paho</groupId>
       <artifactId>org.eclipse.paho.client.mqttv3</artifactId>
       <version>1.2.5</version>
   </dependency>
<!-- https://mvnrepository.com/artifact/org.bouncycastle/bcpkix-jdk15on -->
<dependency>
   <groupId>org.bouncycastle</groupId>
   <artifactId>bcpkix-jdk15on</artifactId>
   <version>1.70</version>
</dependency>

然后使用如下代碼創(chuàng)建 SSLUtils.java 文件。文章來源地址http://www.zghlxwxcb.cn/news/detail-682302.html

import cn.hutool.core.io.FileUtil;
import com.alibaba.cloud.commons.lang.StringUtils;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.openssl.PEMKeyPair;
import org.bouncycastle.openssl.PEMParser;
import org.bouncycastle.openssl.jcajce.JcaPEMKeyConverter;
import org.springframework.core.io.ClassPathResource;

import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManagerFactory;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileReader;
import java.security.KeyPair;
import java.security.KeyStore;
import java.security.Security;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;

/**
 * @author chenzhongchao
 * @program hierway-guacamole
 * @description
 * @packagename com.hierway.modbus.client
 * @date 2023-08-25 16:51
 **/
public class SSLUtils {
    public static SSLSocketFactory getSocketFactory( String caCrtFile,
                                                     String crtFile,  String keyFile,  String password)
            throws Exception {
        Security.addProvider(new BouncyCastleProvider());
        if (StringUtils.isEmpty(password)){
            password = "";
        }
        // load CA certificate
        X509Certificate caCert = null;
        String path = System.getProperty("user.dir");
        if (!FileUtil.exist(caCrtFile)){
            if (!FileUtil.exist(path+File.separator+caCrtFile)){
                ClassPathResource classPathResource = new ClassPathResource(caCrtFile);
                caCrtFile = classPathResource.getPath();
            }else{
                caCrtFile = path+File.separator+caCrtFile;
            }
        }
        BufferedInputStream bis =  FileUtil.getInputStream(caCrtFile);
        CertificateFactory cf = CertificateFactory.getInstance("X.509");

        while (bis.available() > 0) {
            caCert = (X509Certificate) cf.generateCertificate(bis);
        }

        // load client certificate
        if (!FileUtil.exist(crtFile)){
            if (!FileUtil.exist(path+File.separator+crtFile)){
                ClassPathResource classPathResource = new ClassPathResource(crtFile);
                crtFile = classPathResource.getPath();
            }else{
                crtFile = path+File.separator+crtFile;
            }
        }
        bis =  FileUtil.getInputStream(crtFile);
        X509Certificate cert = null;
        while (bis.available() > 0) {
            cert = (X509Certificate) cf.generateCertificate(bis);
        }

        // load client private key
        if (!FileUtil.exist(keyFile)){
            if (!FileUtil.exist(path+File.separator+keyFile)){
                ClassPathResource classPathResource = new ClassPathResource(keyFile);
                keyFile = classPathResource.getPath();
            }else{
                keyFile = path+File.separator+keyFile;
            }
        }
        PEMParser pemParser = new PEMParser(new FileReader(FileUtil.file(keyFile)));
        Object object = pemParser.readObject();
        JcaPEMKeyConverter converter = new JcaPEMKeyConverter().setProvider("BC");
        KeyPair key = converter.getKeyPair((PEMKeyPair) object);
        pemParser.close();

        // CA certificate is used to authenticate server
        KeyStore caKs = KeyStore.getInstance(KeyStore.getDefaultType());
        caKs.load(null, null);
        caKs.setCertificateEntry("ca-certificate", caCert);
        TrustManagerFactory tmf = TrustManagerFactory.getInstance("X509");
        tmf.init(caKs);

        // client key and certificates are sent to server so it can authenticate
        KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
        ks.load(null, null);
        ks.setCertificateEntry("certificate", cert);
        ks.setKeyEntry("private-key", key.getPrivate(), password.toCharArray(),
                new java.security.cert.Certificate[]{cert});
        KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory
                .getDefaultAlgorithm());
        kmf.init(ks, password.toCharArray());

        // finally, create SSL socket factory
        SSLContext context = SSLContext.getInstance("TLSv1.2");
        context.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);

        return context.getSocketFactory();
    }

}
 MemoryPersistence persistence = new MemoryPersistence();
            try {
                
                //當未設(shè)置標識時隨機一個
                if (StringUtils.isEmpty(clientId)) {
                    clientId = UUID.randomUUID().toString().replace("-", "");
                }
                mqttAsyncClient = new MqttAsyncClient(serverURI, clientId, persistence);
                // MQTT 連接選項
                MqttConnectOptions connOpts = new MqttConnectOptions();
                //設(shè)置MQTT連接賬號密碼
                connOpts.setUserName(userName);
                if (!StringUtils.isEmpty(password)){
                    connOpts.setPassword(password.toCharArray());
                }
               
                connOpts.setCleanSession(true);
                if (serverURI.indexOf("ssl")>=0){
                    SSLSocketFactory socketFactory = SSLUtils.getSocketFactory(cacert, clientCert, clientKey, clientPassword);
                    connOpts.setSocketFactory(socketFactory);
                }
                connOpts.setAutomaticReconnect(true);
                // 設(shè)置心跳秒數(shù)
                connOpts.setKeepAliveInterval(60);
                // 設(shè)置回調(diào)
                mqttReconnectCallback =new MqttReconnectCallback();
                mqttAsyncClient.setCallback(mqttReconnectCallback);
                mqttAsyncClient.connect(connOpts);
            } catch (Exception e) {

            }

到了這里,關(guān)于EMQX啟用雙向SSL/TLS安全連接以及java連接的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 配置SSL/TLS以啟用HTTPS加密通信

    簡介 在本教學文章中,我們將學習如何配置Nginx以支持安全套接字層(SSL/TLS),從而啟用HTTPS并提供加密通信。SSL/TLS是一種安全協(xié)議,用于確保在網(wǎng)絡(luò)上進行的通信的保密性和完整性。本教程將介紹如何生成SSL證書,配置Nginx以使用SSL/TLS,并啟用HTTPS。 前提條件 在開始本教

    2024年02月15日
    瀏覽(32)
  • 在Nginx上啟用HTTPS:編譯SSL模塊并配置安全連接的完整指南

    在安裝Nginx時,默認情況下可能不包括HTTPS支持,要啟用HTTPS,需要確保Nginx編譯時包含了SSL模塊。以下是詳細的步驟,用于在Nginx上啟用HTTPS: Linux下Nginx的安裝與基本命令操作指南 配置Nginx : 在配置Nginx之前,檢查是否已經(jīng)啟用了SSL模塊: 如果看不到 --with-http_ssl_module 選項,

    2024年04月28日
    瀏覽(44)
  • java連接mqtt(tcp、ssl單雙向)

    mqtt服務(wù)器的選擇與安裝 emqx擁有界面,可視化比較好,但是windows下安裝有問題,后面采用虛擬機安裝沒問題 mosquitto:windows下安裝簡單,使用也簡單,但是功能比較單一,只能通過命令操作,無界面 2.mosquitto的安裝: windows下搭建mqtt服務(wù)器 3.java相關(guān)坐標 4.創(chuàng)建客戶端:發(fā)布客

    2024年04月29日
    瀏覽(233)
  • gRPC — SSL/TLS單向認證、雙向認證、Token認證

    gRPC — SSL/TLS單向認證、雙向認證、Token認證

    傳輸層安全性協(xié)議(Transport Layer Security,縮寫作 TLS ) ,其前身 安全套接層(Secure Sockets Layer,縮寫作 SSL )是一種安全協(xié)議,目的是為互聯(lián)網(wǎng)通信提供安全及數(shù)據(jù)完整性保障。根據(jù)傳輸層安全協(xié)議的規(guī)范,客戶端與服務(wù)端的連接安全應該具備連接是私密的或連接是可靠的一

    2024年04月09日
    瀏覽(37)
  • C#調(diào)用webapi HTTPS報錯:基礎(chǔ)連接已經(jīng)關(guān)閉: 未能為 SSL/TLS 安全通道建立信任關(guān)系--安全證書問題

    1、首先加入命名空間: using System.Net.Security; using System.Security.Authentication; using System.Security.Cryptography.X509Certificates; SSL網(wǎng)站,連接時需要提供證書,對于非必須提供客戶端證書的情況,只要返回一個安全確認即可。我的是.NET FrameWork4.0 2、加入以下代碼: 3、接收證書進行身份驗

    2024年02月13日
    瀏覽(23)
  • C#/.Net 爬蟲request.GetResponse()報錯:基礎(chǔ)連接已經(jīng)關(guān)閉: 未能為 SSL/TLS 安全通道建立信任關(guān)系/根據(jù)驗證過程,遠程證書無效

    C#/.Net 爬蟲request.GetResponse()報錯:基礎(chǔ)連接已經(jīng)關(guān)閉: 未能為 SSL/TLS 安全通道建立信任關(guān)系/根據(jù)驗證過程,遠程證書無效

    首先,先放置一張報錯的圖片: 原因: 網(wǎng)站的證書應該是失效了,并且我發(fā)起的請求是基于Https的,所以被系統(tǒng)認定為不安全的連接。并且通過微軟官方文檔的解釋如下: 解決方案: 1.需要使用 ServicePointManager.SecurityProtoco 屬性,這個屬性的解釋如下,詳細可以看官方文檔:

    2024年02月16日
    瀏覽(37)
  • SSL/TLS協(xié)議詳解以及配置實戰(zhàn)

    目錄 1、什么是 SSL/TLS協(xié)議? 2、SSL協(xié)議和TLS協(xié)議的關(guān)系 3、如何使用SSL/TLS協(xié)議? 4、使用 HttpClient 發(fā)送一個SSL/TLS連接請求 5、瀏覽器端如何驗證數(shù)字證書的合法性? 6、如何在Nginx服務(wù)器上配置SSL/TLS協(xié)議? 7、如何在 Java Web 項目中使用SSL/TLS協(xié)議? 8、如何在 Java SpringBoot 項目中

    2024年02月08日
    瀏覽(27)
  • SSL/TLS介紹以及wireshark抓包TLS Handshake報文

    SSL/TLS介紹以及wireshark抓包TLS Handshake報文

    SSL(Secure Sockets Layer)和TLS(Transport Layer Security)是一種安全協(xié)議,用于在計算機網(wǎng)絡(luò)上實現(xiàn)加密通信。SSL最初由美國Netscape開發(fā),隨后發(fā)展為TLS,并得到了廣泛應用,成為互聯(lián)網(wǎng)上保護通信安全的標準協(xié)議。 TLS 位于 TCP 之上(也有基于 UDP 的,稱為DTLS,這里不討論它),如

    2024年02月03日
    瀏覽(26)
  • 查看MySQL服務(wù)器是否啟用了SSL連接,并且查看ssl證書是否存在

    查看MySQL服務(wù)器是否啟用了SSL連接,并且查看ssl證書是否存在

    文章目錄 一、查看MySQL服務(wù)器是否啟用了SSL連接 1.登錄MySQL服務(wù)器 2.查看SSL配置 二、查看證書是否存在 查看MySQL服務(wù)器是否啟用了SSL連接,并且查看ssl證書是否存在 在Linux終端中,可以通過以下命令登錄MySQL服務(wù)器: mysql -u username -p 其中,username為MySQL服務(wù)器的用戶名。執(zhí)行該

    2024年02月15日
    瀏覽(24)
  • SSL/TLS 介紹以及如何利用openssl生成證書

    SSL/TLS 介紹以及如何利用openssl生成證書

    SSL:Secure Socket Layer 安全套接字層。 TLS:Transport layer Security 傳輸層安全性,是一種加密協(xié)議。 到2020年,SSL以及TLS1.0,TLS1.1已被棄用 Authentication:通信雙方可以確認雙方的身份,不被黑客攔截信息偽造身份。 Confidentiality:通信的內(nèi)容經(jīng)過加密,更加安全,不被授權(quán)的用戶無法識別

    2024年02月04日
    瀏覽(21)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包