亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

從零開(kāi)始使用Rust編寫(xiě)nginx(TLS證書(shū)快過(guò)期了)

 更新時(shí)間:2024年03月01日 12:04:17   作者:?jiǎn)柮煞?wù)框架??博客園VIP會(huì)員  
wmproxy已用Rust實(shí)現(xiàn)http/https代理,?socks5代理,?反向代理,?負(fù)載均衡,?靜態(tài)文件服務(wù)器,websocket代理,四層TCP/UDP轉(zhuǎn)發(fā),內(nèi)網(wǎng)穿透等,本文給大家介紹從零開(kāi)始使用Rust編寫(xiě)nginx(TLS證書(shū)快過(guò)期了),感興趣的朋友一起看看吧

wmproxy

wmproxy已用Rust實(shí)現(xiàn)http/https代理, socks5代理, 反向代理, 負(fù)載均衡, 靜態(tài)文件服務(wù)器,websocket代理,四層TCP/UDP轉(zhuǎn)發(fā),內(nèi)網(wǎng)穿透等,會(huì)將實(shí)現(xiàn)過(guò)程分享出來(lái),感興趣的可以一起造個(gè)輪子

項(xiàng)目地址

國(guó)內(nèi): https://gitee.com/tickbh/wmproxy

github: https://github.com/tickbh/wmproxy

設(shè)計(jì)目標(biāo)

證書(shū)的自動(dòng)續(xù)期,讓系統(tǒng)免除證書(shū)過(guò)期的煩惱,保證系統(tǒng)的正確運(yùn)行。

關(guān)于證書(shū)的驗(yàn)證

證書(shū)的組成部分:公鑰,私鑰

公鑰部分

公開(kāi)的信息cert,也稱公鑰,在nginx體系中通常以.pem結(jié)尾

Cert,作為“Certificate”(證書(shū))的縮寫(xiě),通常用于表示網(wǎng)絡(luò)安全和加密領(lǐng)域中的數(shù)字證書(shū)。這些證書(shū)是用于證明身份和保障安全性的重要工具,包含了許多關(guān)鍵信息。

一般來(lái)說(shuō),證書(shū)中存放的信息主要包括:

  • 證書(shū)頒發(fā)機(jī)構(gòu)(Certificate Authority,CA)的信息:這包括CA的名稱、公鑰和證書(shū)頒發(fā)者的數(shù)字簽名等。這些信息用于驗(yàn)證證書(shū)的合法性和真實(shí)性。
  • 證書(shū)持有者的信息:這通常包括組織或個(gè)人的名稱、域名、公鑰和證書(shū)持有者的數(shù)字簽名等。這些信息用于標(biāo)識(shí)證書(shū)的所有者和驗(yàn)證其身份。
  • 證書(shū)的有效期:證書(shū)通常有一個(gè)有效期限,包括開(kāi)始日期和結(jié)束日期。這用于確定證書(shū)是否仍在有效期內(nèi)。

此外,證書(shū)中還可能包含其他信息,例如證書(shū)的序列號(hào)、擴(kuò)展字段等。這些信息對(duì)于特定的應(yīng)用場(chǎng)景可能具有重要意義。

總之,Cert中存放的信息是數(shù)字證書(shū)的重要組成部分,對(duì)于保障網(wǎng)絡(luò)安全和身份認(rèn)證具有重要意義。

私鑰部分

服務(wù)器專(zhuān)用的信息,稱為私鑰,在nginx體系中通常以.key結(jié)尾

私鑰的主要作用是在TLS加密通信過(guò)程中,對(duì)從服務(wù)器發(fā)送到客戶端的數(shù)據(jù)進(jìn)行加密,以確保數(shù)據(jù)的機(jī)密性和安全性。當(dāng)客戶端向服務(wù)器發(fā)送請(qǐng)求時(shí),服務(wù)器會(huì)使用其私鑰對(duì)響應(yīng)數(shù)據(jù)進(jìn)行加密,然后發(fā)送給客戶端。客戶端在接收到加密數(shù)據(jù)后,會(huì)使用服務(wù)器公鑰進(jìn)行解密,從而獲取到原始數(shù)據(jù)。

由于私鑰的非公開(kāi)性,如果私鑰被泄露,將會(huì)對(duì)TLS加密通信的安全性造成嚴(yán)重威脅。因此,私鑰的生成、存儲(chǔ)和使用都需要遵循嚴(yán)格的安全標(biāo)準(zhǔn)和最佳實(shí)踐。通常,私鑰應(yīng)該在安全的環(huán)境中生成,并且只由授權(quán)的人員管理和使用。

在TLS證書(shū)的生命周期中,私鑰的管理和使用也是非常重要的。一旦私鑰丟失或泄露,就需要重新生成新的密鑰對(duì)和證書(shū),以確保加密通信的安全性。因此,對(duì)于TLS證書(shū)的私鑰部分,必須采取嚴(yán)格的安全措施,以確保其機(jī)密性和安全性。

證書(shū)無(wú)效的可能

SSL證書(shū)可能會(huì)因?yàn)槎喾N原因而無(wú)效。以下是一些常見(jiàn)的情況:

  • 證書(shū)過(guò)期:SSL證書(shū)有有效期限,一旦過(guò)期,瀏覽器會(huì)拒絕連接并顯示證書(shū)無(wú)效的警告。為了避免這種情況,管理員需要定期檢查證書(shū)的到期日期,并在必要時(shí)進(jìn)行更新或續(xù)訂。
  • 域名不匹配:SSL證書(shū)是針對(duì)特定的域名頒發(fā)的,如果證書(shū)中的域名與實(shí)際訪問(wèn)的域名不匹配,瀏覽器也會(huì)顯示證書(shū)無(wú)效。這可能是因?yàn)樽C書(shū)是為另一個(gè)域名頒發(fā)的,或者證書(shū)中包含的域名拼寫(xiě)錯(cuò)誤。
  • 證書(shū)鏈不完整:SSL證書(shū)通常依賴于一個(gè)證書(shū)頒發(fā)機(jī)構(gòu)(CA)的證書(shū)鏈。如果證書(shū)鏈中的任何證書(shū)丟失或損壞,瀏覽器可能無(wú)法驗(yàn)證證書(shū)的有效性,并顯示證書(shū)無(wú)效。
  • 瀏覽器不受信任:如果證書(shū)頒發(fā)機(jī)構(gòu)(CA)的證書(shū)被瀏覽器標(biāo)記為不受信任或被撤銷(xiāo),那么使用該CA頒發(fā)的SSL證書(shū)也將被視為無(wú)效。

此篇中主要介紹證書(shū)過(guò)期如何維護(hù)的可能。

獲取過(guò)期時(shí)間

關(guān)于tls的處理庫(kù),這里選擇的是rustls,查詢其相關(guān)Api及源碼,發(fā)現(xiàn)其并未提供Cert的過(guò)期時(shí)間。這里選擇用第三方庫(kù)x509-certificate來(lái)獲取證書(shū)的過(guò)期時(shí)間,他并不依賴于openssl,可以在不加載openssl的情況下獲取到證書(shū)的過(guò)期時(shí)間。

api相關(guān)函數(shù):

pub fn validity_not_after(&self) -> DateTime<Utc>
// Obtain the certificate validity “not after” time.

設(shè)計(jì)要點(diǎn)

  • 區(qū)分是否為acme的證書(shū)(只有acme證書(shū)才能自動(dòng)獲?。?/li>
  • 讀取證書(shū)的時(shí)候獲取過(guò)期時(shí)間
  • 在接受證書(shū)時(shí)判斷是否過(guò)期

    未過(guò)期,直接繼續(xù)執(zhí)行

    將過(guò)期或者已過(guò)期未加載,請(qǐng)求新的證書(shū)

    已有新的證書(shū),進(jìn)行加載

    保證不會(huì)頻繁加載

  • 用有效的證書(shū)進(jìn)行tls操作

源碼相關(guān)設(shè)計(jì)

新設(shè)計(jì)類(lèi)

/// 包裝tls accepter, 用于適應(yīng)acme及自有證書(shū)兩種
#[derive(Clone)]
pub struct WrapTlsAccepter {
    /// 最后請(qǐng)求的時(shí)間
    pub last: Instant,
    /// 最后成功加載證書(shū)的時(shí)間
    pub last_success: Instant,
    /// 域名
    pub domain: Option<String>,
    pub accepter: Option<TlsAcceptor>,
    /// 證書(shū)的過(guò)期時(shí)間,將加載證書(shū)的時(shí)候同步讀取
    pub expired: Option<DateTime<Utc>>,
    pub is_acme: bool,
}

添加最后成功加載的時(shí)間,與全局的加載成功時(shí)間做比對(duì)。

lazy_static! {
    // 成功加載時(shí)間記錄,以方便將過(guò)期的數(shù)據(jù)做更新
    static ref SUCCESS_CERT: Mutex<HashMap<String, Instant>> = Mutex::new(HashMap::new());
}

判斷是否即將到期,到期前一天將自動(dòng)更新

fn is_tls_will_expired(&self) -> bool {
    if let Some(expire) = &self.expired {
        let now = Utc::now();
        if now.timestamp() > expire.timestamp() - 86400 {
            return true;
        }
    }
    false
}

將過(guò)期時(shí)將重新觸發(fā)加載:

if self.is_acme && self.is_tls_will_expired() {
    let _ = self.check_and_request_cert();
}
#[cfg(feature = "acme-lib")]
fn check_and_request_cert(&self)  -> Result<(), Error> {
    if self.domain.is_none() {
        return Err(io::Error::new(io::ErrorKind::Other, "未知域名").into());
    }
    {
        let mut map = CACHE_REQUEST
            .lock()
            .map_err(|_| io::Error::new(io::ErrorKind::Other, "Fail get Lock"))?;
        if let Some(last) = map.get(self.domain.as_ref().unwrap()) {
            if last.elapsed() < self.get_delay_time() {
                return Err(io::Error::new(io::ErrorKind::Other, "等待上次請(qǐng)求結(jié)束").into());
            }
        }
        map.insert(self.domain.clone().unwrap(), Instant::now());
    };
    let obj = self.clone();
    std::thread::spawn(move || {
        let _ = obj.request_cert();
    });
    Ok(())
}

最后在加載成功后,下一輪的處理中將嘗試的加載ssl證書(shū)

pub fn update_last(&mut self) {
    if self.accepter.is_none() {
        if self.last.elapsed() > Duration::from_secs(5) {
            self.try_load_cert();
            self.last = Instant::now();
        }
    } else {
        if self.domain.is_none() {
            return;
        }
        let map = SUCCESS_CERT.lock().unwrap();
        let doamin = &self.domain.clone().unwrap();
        if !map.contains_key(doamin) {
            return;
        }
        if self.last_success < map[doamin] && self.last < map[doamin] {
            self.try_load_cert();
            self.last = map[doamin];
        }
    }
}

如此一個(gè)擁有自動(dòng)請(qǐng)求且自動(dòng)更新的acme請(qǐng)求已完成。
如果有細(xì)心的已發(fā)現(xiàn)相關(guān)代碼用了feature,基本上等于Cpp中的#ifdef xxx也是用來(lái)控制代碼是否啟用相關(guān)的。

關(guān)于條件編譯 Features

Cargo Feature 是非常強(qiáng)大的機(jī)制,可以為大家提供條件編譯和可選依賴的高級(jí)特性。

相關(guān)鏈接可以參考features

將其中的依賴改成了

acme-lib = { version = "^0.9.1", default-features = true, optional = true}
openssl = { version = "0.10.32", default-features = false, features = ["vendored"], optional = true }

因?yàn)?code>acme-lib依賴于openssl庫(kù),在編譯方面可能會(huì)相對(duì)比較麻煩,需要額外的依賴,此處openssl配置是覆蓋acme-lib中的默認(rèn)features,達(dá)到可以不依賴外部openssl庫(kù)的能力,使用源碼編譯,所以如果要啟用acme-lib能力可以使用

cargo build --features "acme-lib"
如果openssl不好依賴可以使用來(lái)編譯系統(tǒng)
cargo build --features "acme-lib openssl"

總結(jié)

現(xiàn)在免費(fèi)證書(shū)只能申請(qǐng)三個(gè)月(之前還能申請(qǐng)十二個(gè)月),擁有acme能力對(duì)于小的站點(diǎn)來(lái)說(shuō)就比較需要,可以比較好的部署也不用關(guān)心TLS帶來(lái)的煩惱。

到此這篇關(guān)于從零開(kāi)始使用Rust編寫(xiě)nginx(TLS證書(shū)快過(guò)期了)的文章就介紹到這了,更多相關(guān)Rust編寫(xiě)nginx內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Rust之Substrate框架中Core詳解

    Rust之Substrate框架中Core詳解

    Substrate是一個(gè)用于構(gòu)建區(qū)塊鏈的開(kāi)發(fā)框架,它由Parity團(tuán)隊(duì)基于Rust語(yǔ)言開(kāi)發(fā)而成,是一個(gè)開(kāi)箱即用的區(qū)塊鏈構(gòu)造器,本文詳細(xì)介紹了Substrate框架中的Core,需要的朋友可以參考下
    2023-05-05
  • Rust日期與時(shí)間的操作方法

    Rust日期與時(shí)間的操作方法

    Rust的時(shí)間操作主要用到chrono庫(kù),接下來(lái)我將簡(jiǎn)單選一些常用的操作進(jìn)行介紹,感興趣的朋友跟隨小編一起看看吧
    2023-09-09
  • Rust 中的 Packages 與 Crates模塊化構(gòu)建的基礎(chǔ)及開(kāi)發(fā)流程

    Rust 中的 Packages 與 Crates模塊化構(gòu)建的基礎(chǔ)及開(kāi)發(fā)流程

    Rust中的Crate是編譯器處理的最小代碼單元,可以是二進(jìn)制或庫(kù),每個(gè)Crate由一個(gè)CrateRoot文件(通常是src/main.rs或src/lib.rs)定義,本文給大家介紹Rust 中的 Packages 與 Crates模塊化構(gòu)建的基礎(chǔ)及開(kāi)發(fā)流程,感興趣的朋友一起看看吧
    2025-02-02
  • 在Rust應(yīng)用中訪問(wèn).ini格式的配置文件方式

    在Rust應(yīng)用中訪問(wèn).ini格式的配置文件方式

    Rust應(yīng)用中訪問(wèn).ini格式的配置文件,可以使用ini或config庫(kù),以ini庫(kù)為例,在Cargo.toml中添加依賴,然后在代碼中讀取和解析ini文件,確保配置文件路徑正確,使用section和get方法訪問(wèn)配置值
    2025-02-02
  • Rust聲明宏在不同K線bar類(lèi)型中的應(yīng)用小結(jié)

    Rust聲明宏在不同K線bar類(lèi)型中的應(yīng)用小結(jié)

    在K線bar中,往往有很多不同分時(shí)k線圖,比如1,2,3,5,,,,,60,120,250,300…,,不同分鐘類(lèi)型,如果不用宏,那么手寫(xiě)會(huì)比較麻煩,下面就試用一下宏來(lái)實(shí)現(xiàn)不同類(lèi)型的bar,感興趣的朋友一起看看吧
    2024-05-05
  • Rust 原始指針功能探索

    Rust 原始指針功能探索

    這篇文章主要為大家介紹了Rust 原始指針功能探索,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • Rust 枚舉和模式匹配的實(shí)現(xiàn)

    Rust 枚舉和模式匹配的實(shí)現(xiàn)

    枚舉是 Rust 中非常重要的復(fù)合類(lèi)型,也是最強(qiáng)大的復(fù)合類(lèi)型之一,廣泛用于屬性配置、錯(cuò)誤處理、分支流程、類(lèi)型聚合等場(chǎng)景中,本文就來(lái)介紹一下Rust 枚舉和模式匹配,感興趣的可以了解一下
    2023-12-12
  • vscode搭建rust開(kāi)發(fā)環(huán)境的圖文教程

    vscode搭建rust開(kāi)發(fā)環(huán)境的圖文教程

    本文主要介紹了vscode搭建rust開(kāi)發(fā)環(huán)境的圖文教程,文中通過(guò)圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-08-08
  • Rust如何進(jìn)行模塊化開(kāi)發(fā)技巧分享

    Rust如何進(jìn)行模塊化開(kāi)發(fā)技巧分享

    Rust模塊化,模塊化有助于代碼的管理和層次邏輯的清晰,本文主要介紹了Rust如何進(jìn)行模塊化開(kāi)發(fā),結(jié)合實(shí)例代碼給大家講解的非常詳細(xì),需要的朋友可以參考下
    2023-01-01
  • Rust?中?Deref?Coercion講解

    Rust?中?Deref?Coercion講解

    Rust 的設(shè)計(jì)理念一向是顯式比隱式好,也就是說(shuō)所有的行為盡量在代碼中表現(xiàn)出來(lái),這篇文章主要介紹了Rust?中?Deref?Coercion?介紹,需要的朋友可以參考下
    2022-10-10

最新評(píng)論