Mqttnet的MqttClientTlsOptions.CertificateValidationHandler詳解

MqttClientTlsOptions.CertificateValidationHandler?是 MQTTnet 庫中用于自定義 TLS 證書驗證邏輯的關鍵回調函數。在 MQTT 客戶端與服務器建立 TLS 連接時,該回調允許你覆蓋默認的證書驗證流程,實現自定義的安全策略。

核心作用

當 MQTT 客戶端通過 TLS 連接到服務器時,系統會默認驗證服務器證書的有效性(如證書鏈、有效期、域名匹配等)。CertificateValidationHandler?允許你:

  • 自定義驗證規則:例如,接受自簽名證書、特定 CA 頒發的證書。
  • 實現額外安全檢查:如驗證證書指紋、檢查證書擴展字段。
  • 禁用部分驗證(不推薦,但在測試環境中有用)。

回調函數簽名

public delegate bool X509CertificateValidator(X509Certificate certificate,X509Chain chain,SslPolicyErrors sslPolicyErrors,IMqttClientOptions options);
參數說明
  1. certificate
    服務器提供的證書(X509Certificate?類型,可轉換為?X509Certificate2)。

  2. chain
    證書鏈對象,包含從服務器證書到根 CA 的完整路徑,可用于檢查證書鏈狀態。

  3. sslPolicyErrors
    系統默認驗證產生的錯誤(枚舉類型):

    • None:無錯誤,證書有效。
    • RemoteCertificateChainErrors:證書鏈驗證失敗(如證書未由受信任的 CA 簽名)。
    • RemoteCertificateNameMismatch:證書域名與連接的服務器域名不匹配。
    • RemoteCertificateNotAvailable:服務器未提供證書。
  4. options
    當前 MQTT 客戶端的連接選項,可用于獲取額外上下文(如服務器地址)。

返回值

  • true:接受證書,允許建立連接。
  • false:拒絕證書,終止連接。

常見應用場景

1.?接受自簽名證書
var tlsOptions = new MqttClientTlsOptions
{UseTls = true,CertificateValidationHandler = (cert, chain, errors, opts) =>{// 僅在測試環境接受所有證書#if DEBUGreturn true;#else// 生產環境使用默認驗證return errors == SslPolicyErrors.None;#endif}
};
2.?驗證證書指紋(Thumbprint)
var expectedThumbprint = "1234567890ABCDEF..."; // 預期的證書 SHA-1 指紋tlsOptions.CertificateValidationHandler = (cert, chain, errors, opts) =>
{// 先檢查系統驗證結果if (errors == SslPolicyErrors.None)return true;// 若域名不匹配,直接拒絕if ((errors & SslPolicyErrors.RemoteCertificateNameMismatch) != 0)return false;// 轉換為 X509Certificate2 以獲取指紋using var cert2 = new X509Certificate2(cert);return cert2.Thumbprint.Equals(expectedThumbprint, StringComparison.OrdinalIgnoreCase);
};
3.?驗證特定 CA 頒發的證書
// 加載自定義 CA 證書
var customCaCert = new X509Certificate2(File.ReadAllBytes("custom_ca.crt"));tlsOptions.CertificateValidationHandler = (cert, chain, errors, opts) =>
{// 清空默認 CA,只信任自定義 CAchain.ChainPolicy.ExtraStore.Add(customCaCert);chain.ChainPolicy.TrustMode = X509ChainTrustMode.CustomRootTrust;// 重新驗證return chain.Build(new X509Certificate2(cert));
};
CertificateValidationHandler = (certContext) =>
{var chain = certContext.Chain;chain.ChainPolicy.RevocationMode = X509RevocationMode.NoCheck;chain.ChainPolicy.RevocationFlag = X509RevocationFlag.ExcludeRoot;chain.ChainPolicy.VerificationFlags = X509VerificationFlags.NoFlag;chain.ChainPolicy.VerificationTime = DateTime.UtcNow;chain.ChainPolicy.UrlRetrievalTimeout = new TimeSpan(0, 0, 0);chain.ChainPolicy.CustomTrustStore.Add(ca);chain.ChainPolicy.TrustMode = X509ChainTrustMode.CustomRootTrust;var x5092 = new X509Certificate2(certContext.Certificate);return chain.Build(x5092);
}, 
  • RevocationMode.NoCheck:不檢查證書吊銷列表(CRL)或在線證書狀態協議(OCSP)。這會跳過證書是否已被 CA 吊銷的驗證,可能帶來安全風險。
  • RevocationFlag.ExcludeRoot:在檢查吊銷狀態時排除根證書(通常根證書不會被吊銷)。
  • VerificationFlags.NoFlag:不添加任何特殊驗證標志,使用默認驗證規則。
  • VerificationTime = DateTime.UtcNow:驗證證書在當前時間點是否有效(不過期)。
  • UrlRetrievalTimeout = TimeSpan.Zero:禁用從網絡獲取 CRL 或 OCSP 響應的超時等待。
  • CustomTrustStore.Add(ca):將指定的 CA 證書(ca)添加到自定義信任存儲中。
  • TrustMode.CustomRootTrust:僅信任自定義存儲中的根證書,忽略系統默認的信任根。這意味著只有你明確添加的 CA 證書才會被視為可信。
  • 將服務器證書轉換為?X509Certificate2?格式,然后嘗試構建完整的證書鏈。
  • chain.Build(x5092):返回?true?表示證書鏈驗證成功,false?表示失敗。
4.?記錄驗證錯誤(不影響連接)
tlsOptions.CertificateValidationHandler = (cert, chain, errors, opts) =>
{if (errors != SslPolicyErrors.None){Logger.Warning($"證書驗證警告: {errors}");foreach (var status in chain.ChainStatus){Logger.Warning($"證書鏈狀態: {status.Status} - {status.StatusInformation}");}}// 仍使用系統默認驗證結果return errors == SslPolicyErrors.None;
};

注意事項

  1. 安全風險

    • 過度寬松的驗證(如始終返回?true)會使連接易受中間人攻擊。
    • 僅在受信任的環境(如內部網絡、測試環境)中降低驗證標準。
  2. 性能考慮

    • 復雜的驗證邏輯(如聯網查詢證書吊銷列表)可能影響連接性能。
  3. 證書鏈處理

    • 系統默認會構建證書鏈,但在自定義驗證中可能需要手動操作(如添加中間 CA)。
  4. 域名驗證

    • 若服務器證書域名與實際連接的域名不一致,需特別處理?RemoteCertificateNameMismatch?錯誤。

最佳實踐

  • 優先使用系統驗證:僅在必要時覆蓋默認邏輯。
  • 最小化信任范圍:如僅接受特定指紋的證書,而非所有自簽名證書。
  • 記錄驗證過程:記錄警告和錯誤,便于排查問題。
  • 區分環境:測試環境可放寬驗證,生產環境必須嚴格。

總結

CertificateValidationHandler?是 MQTTnet 中實現自定義 TLS 安全策略的強大工具,通過它可以靈活應對各種復雜的安全需求。但需謹慎使用,確保在增強靈活性的同時不犧牲安全性。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/93430.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/93430.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/93430.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【圖像噪點消除】——圖像預處理(OpenCV)

目錄 1 均值濾波 2 方框濾波 3 高斯濾波 4 中值濾波 5 雙邊濾波 6 小結 噪聲:圖像中的一些干擾因素。通常是由于圖像采集設備、傳輸信道等因素造成的,表現為圖像中隨機的亮度。常見的噪聲類型有高斯噪聲和椒鹽噪聲。高斯噪聲是一種分布符合正態分布…

Vulnhub napping-1.0.1靶機滲透攻略詳解

一、下載靶機 下載地址:https://download.vulnhub.com/napping/napping-1.0.1.ova 下載好后使用VM打開,將網絡配置模式改為net,防止橋接其他主機干擾(橋接Mac地址也可確定主機)。 二、發現主機 使用nmap掃描沒有相應…

Kubernetes自動擴容方案

Kubernetes 自動擴容可以概括為 “三層六類”:層級類型觸發維度官方/社區方案一句話說明Pod 級HPACPU / 內存 / 自定義 / 外部指標內置副本數橫向擴縮,最常用VPACPU / 內存社區組件單 Pod 資源豎向擴縮,不改副本數KEDA任意事件(隊…

linux命令ps的實際應用

ps(Process Status)是 ?Linux/Unix 系統中最核心的進程管理工具,用于實時抓取系統進程快照。它直接讀取 /proc 文件系統,不持續監控進程(區別于 top),但可通過參數組合實現精準進程診斷。下面從…

深入理解C語言:詳解直接插入排序的實現與優化

目錄 引言 一、直接插入排序的相關概念 1.1、基本概念 1.2、直接插入排序過程詳解 二、代碼實現 三、時間復雜度 四、希爾排序 4.1、希爾排序的陳述 4.2、代碼實現 4.3、時間復雜度 結語 引言 在計算機科學的世界里,排序算法是基礎且重要的組成部分。它們…

【DRAM存儲器五十五】LPDDR5介紹--command bus training

??個人主頁:highman110 ??作者簡介:一名硬件工程師,持續學習,不斷記錄,保持思考,輸出干貨內容 參考資料:《某LPDDR5數據手冊》 、《JESD209-5A》 在為高頻或中頻操作啟用ODT之前,必須對L

一道曾經百度面試題

🚀個人主頁:BabyZZの秘密日記 📖收入專欄:C語言 🌍文章目入1. 題目重現2. 大小端到底在比什么?3. 解法一:聯合體(union)為什么一行就夠?使用示例4. 解法二&am…

VIKOR(Multi-criteria Optimization and Compromise Solution)簡介與簡單示例

前言 提醒: 文章內容為方便作者自己后日復習與查閱而進行的書寫與發布,其中引用內容都會使用鏈接表明出處(如有侵權問題,請及時聯系)。 其中內容多為一次書寫,缺少檢查與訂正,如有問題或其他拓展…

【算法訓練營Day18】二叉樹part8

文章目錄修剪二叉搜索樹將有序數組轉換為二叉搜索樹把二叉搜索樹轉換為累加樹修剪二叉搜索樹 題目鏈接:669. 修剪二叉搜索樹 解題邏輯: 因為在刪除的同時要保證相對結構,所以我們不能沿用上一篇文章中的刪除邏輯,新的刪除邏輯為&…

【C++篇】“內存泄露”的寶藏手段:智能指針

目錄 智能指針的使用場景分析 RAII和智能指針的設計思路 C標準庫智能指針的使用 auto_ptr的使用: unique_ptr的使用: shared_ptr的使用: 模擬shared_ptr: 定制刪除器: shared_ptr的循環引用 weak_ptr 智能指針的使用場景…

【密碼學】4. 分組密碼

目錄分組密碼分組密碼概述Feistel 密碼結構數據加密標準(DES)差分密碼分析與線性密碼分析分組密碼的運行模式國際數據加密算法(IDEA)高級加密標準(AES,Rijndael)中國商用密碼 SM4祖沖之密碼&…

單片機(STM32-WIFI模塊)

一、WIFI模塊介紹 1. ESP12-F模組介紹 1.1 簡介 ESP12-F模組(安信可(Ai-Thinker)ESP8266系列模組)是一款基于樂鑫(Espressif)公司ESP8266芯片的Wi-Fi無線通信模塊,廣泛應用于物聯網&#xff0…

PyTorch 數據類型和使用

關于PyTorch的數據類型和使用的學習筆記 系統介紹了PyTorch的核心數據類型Tensor及其應用。Tensor作為多維矩陣數據容器,支持0-4維數據結構(標量到批量圖像),并提供了多種數值類型(float32/int64等)。通過…

[python刷題模板] LogTrick

[python刷題模板] LogTrick 一、 算法&數據結構1. 描述2. 復雜度分析3. 常見應用4. 常用優化二、 模板代碼1. 特定或值的最短子數組2. 找特定值3. 找位置j的最后一次被誰更新4. 問某個或和的數量三、其他四、更多例題五、參考鏈接一、 算法&數據結構 1. 描述 LogTric…

Vim與VS Code

Vim is a clone, with additions, of Bill Joys vi text editor program for Unix. It was written by Bram Moolenaar based on source for a port of the Stevie editor to the Amiga and first released publicly in 1991.其實這個本身不是 IDE (只有在加入和配置…

[2025CVPR-圖象分類方向]CATANet:用于輕量級圖像超分辨率的高效內容感知標記聚合

?1. 研究背景與動機? ?問題?:Transformer在圖像超分辨率(SR)中計算復雜度隨空間分辨率呈二次增長,現有方法(如局部窗口、軸向條紋)因內容無關性無法有效捕獲長距離依賴。?現有局限?: SPI…

課題學習筆記3——SBERT

1 引言在構建基于知識庫的問答系統時,"語義匹配" 是核心難題 —— 如何讓系統準確識別 "表述不同但含義相同" 的問題?比如用戶問 "對親人的期待是不是欲?",系統能匹配到知識庫中 "追名逐利是欲…

在Word和WPS文字中把全角數字全部改為半角

大部分情況下我們在Word或WPS文字中使用的數字或標點符號都是半角,但是有時不小心按錯了快捷鍵或者點到了輸入法的全角半角切換圖標,就輸入了全角符號和數字。不用擔心,使用它們自帶的全角、半角轉換功能即可快速全部轉換回來。一、為什么會輸…

數據結構的基本知識

一、集合框架1、什么是集合框架Java集合框架(Java Collection Framework),又被稱為容器(container),是定義在java.util包下的一組接口(interfaces)和其實現類(classes).主要表現為把多個元素(element)放在一個單元中,用于對這些元素進行快速、便捷的存儲(store&…

WebStack-Hugo | 一個靜態響應式導航主題

WebStack-Hugo | 一個靜態響應式導航主題 #10 shenweiyan announced in 1.3-折騰 WebStack-Hugo | 一個靜態響應式導航主題#10 ?編輯shenweiyan on Oct 23, 2023 6 comments 7 replies Return to top shenweiyan on Oct 23, 2023 Maintainer Via:我給自己…