程+優(yōu)先級(jí)隊(duì)列+指數(shù)退避三大性能原理)
如何讀懂SSLyze SSL掃描引擎多進(jìn)程優(yōu)先級(jí)隊(duì)列指數(shù)退避三大性能原理【免費(fèi)下載鏈接】sslyzeCurrent development of SSLyze now takes place on a separate repository項(xiàng)目地址: https://gitcode.com/gh_mirrors/ssl/sslyzeSSLyze 是一款開(kāi)源、免費(fèi)的高性能 SSL/TLS 掃描器通過(guò)多進(jìn)程掃描、優(yōu)先級(jí)隊(duì)列和指數(shù)退避重試三大機(jī)制讓大規(guī)模證書(shū)與安全檢測(cè)又快又穩(wěn)。本文帶你用 5 分鐘讀懂它的掃描引擎設(shè)計(jì)原理 SSLyze 是什么為什么它掃得又快又全SSLyze 是一個(gè) Python 編寫(xiě)的 SSL 掃描工具連接目標(biāo)服務(wù)器后分析其 SSL 配置支持 SSL 2.0/3.0 與 TLS 1.0/1.1/1.2可檢測(cè)弱加密套件、不安全重協(xié)商、CRIME、Heartbleed還能做證書(shū)鏈驗(yàn)證、會(huì)話恢復(fù)性能測(cè)試并支持 SMTP、XMPP、FTP 等協(xié)議的 StartTLS 掃描。它的快不是偶然而是三個(gè)核心設(shè)計(jì)疊加的結(jié)果機(jī)制解決的問(wèn)題核心文件多進(jìn)程池單進(jìn)程掃描太慢sslyze.py優(yōu)先級(jí)隊(duì)列激進(jìn)命令并發(fā)會(huì)打垮目標(biāo)服務(wù)器sslyze.py指數(shù)退避重試網(wǎng)絡(luò)抖動(dòng)導(dǎo)致結(jié)果不準(zhǔn)utils/SSLyzeSSLConnection.py多進(jìn)程架構(gòu)3 到 12 個(gè)工作進(jìn)程如何分工在 sslyze.py 中主程序會(huì)根據(jù)目標(biāo)數(shù)量動(dòng)態(tài)計(jì)算進(jìn)程數(shù)每個(gè)目標(biāo)按 3 個(gè)任務(wù)估算進(jìn)程數(shù)取max(3, min(12, 目標(biāo)數(shù)×3))使用 3 個(gè)以上目標(biāo)時(shí)進(jìn)程數(shù)線性增長(zhǎng)超過(guò) 12 個(gè)目標(biāo)后封頂在 12 個(gè)進(jìn)程如果走 HTTPS 代理隧道則強(qiáng)制只用 1 個(gè)進(jìn)程避免把代理打掛每個(gè)WorkerProcess工作循環(huán)都很簡(jiǎn)單從隊(duì)列取任務(wù) → 實(shí)例化對(duì)應(yīng)插件 → 調(diào)用插件的process_task()→ 把結(jié)果放進(jìn)結(jié)果隊(duì)列。任務(wù)以哨兵值None表示全部完成優(yōu)雅退出。 這種取任務(wù)—執(zhí)行—回報(bào)的管道式設(shè)計(jì)讓 12 個(gè)進(jìn)程互不干擾地并行掃描是 SSLyze 批量掃描秒級(jí)提速的關(guān)鍵。優(yōu)先級(jí)隊(duì)列給目標(biāo)服務(wù)器限速的智慧有些命令如暴力枚舉加密套件會(huì)同時(shí)打開(kāi)大量連接稱(chēng)為激進(jìn)命令aggressive。如果多個(gè)進(jìn)程同時(shí)對(duì)同一臺(tái)服務(wù)器跑這類(lèi)命令服務(wù)器很可能直接斷連。SSLyze 的解法很巧妙每個(gè)目標(biāo)被分配一個(gè)專(zhuān)屬的高優(yōu)先級(jí)隊(duì)列用cycle循環(huán)輪轉(zhuǎn)分配給各進(jìn)程激進(jìn)命令只放進(jìn)該目標(biāo)的專(zhuān)屬隊(duì)列 →同一目標(biāo)上的激進(jìn)命令永遠(yuǎn)串行執(zhí)行普通命令放進(jìn)共享任務(wù)隊(duì)列→ 所有進(jìn)程自由并發(fā)搶占工作進(jìn)程會(huì)先消費(fèi)自己的優(yōu)先級(jí)隊(duì)列取完哨兵值后才切換到共享隊(duì)列。這樣既保證了溫和命令的并行度又保護(hù)了目標(biāo)服務(wù)器不被激進(jìn)命令壓垮——這正是 sslyze.py 中雙隊(duì)列設(shè)計(jì)的精髓。指數(shù)退避重試連接失敗也不丟結(jié)果掃描真實(shí)網(wǎng)絡(luò)時(shí)超時(shí)和連接重置是家常便飯。在 utils/SSLyzeSSLConnection.py 的connect()方法中SSLyze 實(shí)現(xiàn)了經(jīng)典的指數(shù)退避Exponential Backoff第 1 次重試隨機(jī)延遲 0~1 秒random.random()避免多個(gè)進(jìn)程同時(shí)重試形成重試風(fēng)暴第 2 次起延遲翻倍delay min(6, 2*delay)上限 6 秒重試次數(shù)由--nb_retries參數(shù)控制默認(rèn) 4 次同時(shí)它還會(huì)區(qū)分**服務(wù)器明確拒絕握手與隨機(jī)網(wǎng)絡(luò)錯(cuò)誤**收到 FIN/RST、handshake failure 等信號(hào)會(huì)立即拋出SSLHandshakeRejected不浪費(fèi)時(shí)間重試只有網(wǎng)絡(luò)抖動(dòng)類(lèi)錯(cuò)誤才進(jìn)入退避重試。 CHANGELOG 也印證了這一點(diǎn)v0.8 版本正是靠加入指數(shù)退避大幅提升了掃描結(jié)果的可靠性與準(zhǔn)確性尤其針對(duì)那些被并發(fā)連接嚇到不響應(yīng)的服務(wù)器。線程池預(yù)檢先探活再派任務(wù)在 utils/ServersConnectivityTester.py 中掃描正式開(kāi)始前有一個(gè)探活階段使用 utils/ThreadPool.py 的輕量線程池最多 50 個(gè)線程并發(fā)連接所有目標(biāo)連接超時(shí)的、DNS 解析失敗的、被拒絕的主機(jī)直接標(biāo)記為 invalid target不再派任何掃描任務(wù)同時(shí)探測(cè)服務(wù)器支持的 SSL 版本TLS 1.0 → SSL 2.3 → SSL 3.0 → TLS 1.2 依次嘗試插件掃描時(shí)直接復(fù)用這個(gè)結(jié)論省去重復(fù)探測(cè)注意這里有個(gè)細(xì)節(jié)探活階段把重試次數(shù)設(shè)為 1因?yàn)橹鳈C(jī)不通就是不通沒(méi)必要反復(fù)確認(rèn)——省時(shí)且語(yǔ)義清晰。實(shí)戰(zhàn)調(diào)優(yōu)三個(gè)參數(shù)讓掃描更快更穩(wěn)--nb_retries超時(shí)/連接錯(cuò)誤多時(shí)調(diào)大默認(rèn) 4追求速度時(shí)調(diào)小定義見(jiàn) utils/CommandLineParser.py--timeout單連接超時(shí)時(shí)間弱網(wǎng)環(huán)境適當(dāng)調(diào)大目標(biāo)清單文件用--targets_in從文件批量讀入目標(biāo)示例見(jiàn) test/top100.txt配合多進(jìn)程池發(fā)揮最大吞吐常見(jiàn)問(wèn)題Q為什么掃描 1 個(gè)目標(biāo)時(shí)感覺(jué)不到多進(jìn)程進(jìn)程數(shù)公式保證最少 3 個(gè)進(jìn)程即使單目標(biāo)也會(huì)用 3 個(gè)進(jìn)程并行跑不同命令。Q為什么某些結(jié)果會(huì)慢半拍該目標(biāo)可能被分配了激進(jìn)命令它在專(zhuān)屬優(yōu)先級(jí)隊(duì)列里串行執(zhí)行屬于正常保護(hù)機(jī)制。Q指數(shù)退避最壞情況會(huì)等多久單次延遲上限 6 秒默認(rèn) 4 次嘗試的總重試開(kāi)銷(xiāo)可控遠(yuǎn)低于反復(fù)立刻重試造成的誤報(bào)??偨Y(jié)SSLyze 的高性能來(lái)自三個(gè)環(huán)環(huán)相扣的設(shè)計(jì)多進(jìn)程池把掃描吞吐拉滿優(yōu)先級(jí)隊(duì)列給激進(jìn)命令上鎖保護(hù)目標(biāo)服務(wù)器指數(shù)退避讓網(wǎng)絡(luò)波動(dòng)不再污染掃描結(jié)果。讀懂這套引擎你也能在自己的掃描器、爬蟲(chóng)或監(jiān)控工具里復(fù)刻同樣的可靠性?!久赓M(fèi)下載鏈接】sslyzeCurrent development of SSLyze now takes place on a separate repository項(xiàng)目地址: https://gitcode.com/gh_mirrors/ssl/sslyze創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考