最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

從零開始使用Rust編寫nginx(TLS證書快過期了)

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

wmproxy

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

項目地址

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

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

設(shè)計目標

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

關(guān)于證書的驗證

證書的組成部分:公鑰,私鑰

公鑰部分

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

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

一般來說,證書中存放的信息主要包括:

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

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

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

私鑰部分

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

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

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

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

證書無效的可能

SSL證書可能會因為多種原因而無效。以下是一些常見的情況:

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

此篇中主要介紹證書過期如何維護的可能。

獲取過期時間

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

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

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

設(shè)計要點

  • 區(qū)分是否為acme的證書(只有acme證書才能自動獲取)
  • 讀取證書的時候獲取過期時間
  • 在接受證書時判斷是否過期

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

    將過期或者已過期未加載,請求新的證書

    已有新的證書,進行加載

    保證不會頻繁加載

  • 用有效的證書進行tls操作

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

新設(shè)計類

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

添加最后成功加載的時間,與全局的加載成功時間做比對。

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

判斷是否即將到期,到期前一天將自動更新

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
}

將過期時將重新觸發(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, "等待上次請求結(jié)束").into());
            }
        }
        map.insert(self.domain.clone().unwrap(), Instant::now());
    };
    let obj = self.clone();
    std::thread::spawn(move || {
        let _ = obj.request_cert();
    });
    Ok(())
}

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

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];
        }
    }
}

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

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

Cargo Feature 是非常強大的機制,可以為大家提供條件編譯和可選依賴的高級特性。

相關(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 }

因為acme-lib依賴于openssl庫,在編譯方面可能會相對比較麻煩,需要額外的依賴,此處openssl配置是覆蓋acme-lib中的默認features,達到可以不依賴外部openssl庫的能力,使用源碼編譯,所以如果要啟用acme-lib能力可以使用

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

總結(jié)

現(xiàn)在免費證書只能申請三個月(之前還能申請十二個月),擁有acme能力對于小的站點來說就比較需要,可以比較好的部署也不用關(guān)心TLS帶來的煩惱。

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

相關(guān)文章

  • Rust?中?Mutex?的基本用法

    Rust?中?Mutex?的基本用法

    Rust?標準庫中的?Mutex?結(jié)構(gòu)體位于?std::sync::Mutex?中,它提供了線程安全的數(shù)據(jù)訪問,Mutex?保證了在同一時間只有一個線程可以訪問被鎖定的數(shù)據(jù),這篇文章主要介紹了Rust?中?Mutex?的基本用法,需要的朋友可以參考下
    2024-05-05
  • Rust語言數(shù)據(jù)類型的具體使用

    Rust語言數(shù)據(jù)類型的具體使用

    在Rust中,每個值都有一個明確的數(shù)據(jù)類型,本文主要介紹了Rust語言數(shù)據(jù)類型的具體使用,具有一定的參考價值,感興趣的可以了解一下
    2024-04-04
  • Rust語言中的String和HashMap使用示例詳解

    Rust語言中的String和HashMap使用示例詳解

    這篇文章主要介紹了Rust語言中的String和HashMap使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-10-10
  • rust 中的 EBNF簡介舉例

    rust 中的 EBNF簡介舉例

    這篇文章主要介紹了rust 中的 EBNF簡介舉例,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2025-05-05
  • Rust字符串字面值的一些經(jīng)驗總結(jié)

    Rust字符串字面值的一些經(jīng)驗總結(jié)

    字符串有兩種表現(xiàn)形式,一種是基本類型,表示字符串的切片,以&str表示,另一種是可變的string類型,下面這篇文章主要給大家介紹了關(guān)于Rust字符串字面值的相關(guān)資料,需要的朋友可以參考下
    2022-04-04
  • Rust 語言的全鏈路追蹤庫 tracing使用方法

    Rust 語言的全鏈路追蹤庫 tracing使用方法

    這篇文章主要介紹了Rust 語言的全鏈路追蹤庫 tracing,接下來就以 tracing 為例,介紹一下trace 的核心概念以及使用方法,需要的朋友可以參考下
    2022-12-12
  • Rust 數(shù)據(jù)分析利器polars用法詳解

    Rust 數(shù)據(jù)分析利器polars用法詳解

    這篇文章主要介紹了Rust 數(shù)據(jù)分析利器polars用法詳解,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2024-08-08
  • Rust處理錯誤的實現(xiàn)方法

    Rust處理錯誤的實現(xiàn)方法

    程序在運行的過程中,總是會不可避免地產(chǎn)生錯誤,而如何優(yōu)雅地解決錯誤,也是語言的設(shè)計哲學(xué)之一。本文就來和大家來了Rust是如何處理錯誤的,感興趣的可以了解一下
    2023-03-03
  • 一文帶你了解Rust是如何處理錯誤的

    一文帶你了解Rust是如何處理錯誤的

    程序在運行的過程中,總是會不可避免地產(chǎn)生錯誤,而如何優(yōu)雅地解決錯誤,也是語言的設(shè)計哲學(xué)之一。本文就來和大家來了Rust是如何處理錯誤的,感興趣的可以了解一下
    2022-11-11
  • Rust如何進行模塊化開發(fā)技巧分享

    Rust如何進行模塊化開發(fā)技巧分享

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

最新評論

洪泽县| 噶尔县| 八宿县| 崇州市| 阳曲县| 巴彦淖尔市| 新邵县| 三台县| 赤壁市| 柘荣县| 无极县| 屏东市| 宁武县| 鲜城| 农安县| 扎赉特旗| 汪清县| 宁武县| 古浪县| 玛多县| 台北县| 惠来县| 邳州市| 乌兰县| 奉新县| 伊吾县| 新建县| 新疆| 班玛县| 鹤山市| 梅河口市| 新龙县| 双辽市| 安龙县| 土默特右旗| 哈密市| 泉州市| 三台县| 吉木萨尔县| 拜城县| 九龙城区|