[auth] tls.crt, tls.key, ca.crt 三者關係 === ###### tags: `K8s` ###### tags: `Kubernetes`, `k8s`, `tls.crt`, `tls.key`, `ca.crt`, `Public Certificate`, `Private Key`, `私鑰`, `公開憑證`, `TLS`, `Transport Layer Security`, `傳輸層安全性協定` <br> [TOC] <br> ## 術語 | term | 英文全名/用法 | 說明 | | ---- | --- |----| | CA | Certificate Authority | 憑證簽發單位<br>負責簽發、驗證及管理數位憑證的機構 | | `.crt` | certificate file extension | 憑證檔案的副檔名 `.crt`<br>通常為 X.509 格式的數位憑證(多半是 PEM 編碼),可用來儲存伺服器憑證或 CA 憑證,用於 TLS/SSL 連線驗證 | <br> --- ## 角色 ### 角色總表 | 角色 | 檔案名稱 | 內容 | 功能 | | --- | ------- | --- | ---- | | 🖥️ **伺服器 (Server)** | `tls.crt` | 公開憑證 | 告訴客戶端「這是誰」 | | | `tls.key` | 私鑰 | 用於簽署與解密 | | | `ca.crt` | CA 憑證 | 用來驗證客戶端的憑證 (client.crt) | | 💻 **客戶端 (Client)** | `client.crt` | 公開憑證 | 告訴伺服器「我是誰」 | | | `client.key` | 私鑰 | 用於簽署與解密 | | | `ca.crt` | CA 憑證 | 用來驗證伺服器的憑證 (tls.crt) | <br> --- ### `.crt` > - `.crt` 是 **certificate** 的縮寫,全稱為: > > **Certificate File**(憑證檔案) > - `.crt` 是公開憑證,用於驗證身份與建立 TLS 加密連線)。 - ### 🔍 詳細說明 * `.crt` 副檔名代表這個檔案內含一份 **數位憑證 (Digital Certificate)**。 * 憑證通常以 **PEM (Privacy Enhanced Mail)** 格式儲存,內容為 Base64 編碼的資料,例如: ``` -----BEGIN CERTIFICATE----- MIIDyzCCArOgAwIBAgIUW5l6aS4z... -----END CERTIFICATE----- ``` * **憑證內包含**: * 公開金鑰 (Public Key) * 憑證擁有者資訊 (Subject) * 簽發者資訊 (Issuer) * 有效期限 (Validity) * 簽章 (Digital Signature) - ### 📁 常見相關副檔名 | 副檔名 | 全稱 | 內容 | 備註 | | ----- | ----- | ----- | ----- | | `.crt` | Certificate | 憑證(常為 PEM 格式) | 最常見於 Linux 環境 | | `.cer` | Certificate | 憑證(可為 PEM 或 DER 格式) | Windows 常用 | | `.pem` | Privacy Enhanced Mail | 可包含憑證、私鑰或兩者 | 以文字形式儲存 | | `.der` | Distinguished Encoding Rules | 憑證的二進位編碼形式 | 常用於 Java | | `.key` | Private Key | 私鑰檔案 | 不可公開 | <br> --- ### `ca` > - `ca` 是 **Certificate Authority** 的縮寫,全稱為: > > **Certificate Authority Certificate**(憑證頒發機構憑證) - ### 🔍 詳細解釋 * **Certificate Authority (CA)** 是負責簽發、驗證及管理數位憑證的機構。 * 它的工作就像「**數位世界的公證人**」: * 驗證伺服器或使用者的身份。 * 使用自己的私鑰對他們的憑證(如 `tls.crt`)簽章。 * 因此,`ca.crt` 就是 **CA 自己的公開憑證**,用來讓其他人能: 1. 驗證 CA 所簽發的憑證是否可信。 2. 驗證簽章是否由這個 CA 所屬的私鑰簽署。 - ### 🧩 簡化關係圖 ```text ca.crt ← 驗證 ← tls.crt │ └── 由 CA 持有的 ca.key 簽發 ``` --- - ### 📁 小結 | 檔案名稱 | 全稱 | 主要用途 | | --------- | ------------------------------------ | --------------- | | `ca.crt` | Certificate Authority Certificate | 驗證伺服器與客戶端憑證的真實性 | | `tls.crt` | Transport Layer Security Certificate | 證明伺服器身份,供他人驗證 | | `tls.key` | Transport Layer Security Private Key | 伺服器私鑰,用於解密與簽章 | --- 換句話說, > `ca.crt` = 「憑證頒發者的身份證明」, > 由它來證明其他憑證(如 `tls.crt`、`client.crt`)是合法可信的。 <br> --- <br> ## 生活案例對照 > by gpt-5.1 (2025/12/03) ### 角色對照表(比喻 ↔ TLS) * 警察:Server * 路人:Client * 警證:`tls.crt`(伺服器憑證 / Server Certificate) * 身分證:`client.crt`(用戶端憑證 / Client Certificate) * 警政署 / 戶政資料庫:`ca.crt`(憑證核發機構 CA) --- ### 結局 1:假警察 vs (真路人 / 假路人) ➡️「Client 驗證 Server 憑證」的世界 1. **警察(Server)要求路人(Client)先出示身分證:** > 「請出示你的身分證!」 2. **路人反問:我怎麼知道你是真的警察?** * 路人說:「請先出示你的 *警證*(`tls.crt`)。」 3. **警察拿出警證(Server 憑證):** * 這張警證上有: * **鋼印/章** → 好比「有 CA 的簽章」(被 `ca.crt` 簽過) * **警號、姓名、單位** → 好比「憑證裡的主體資訊(CN、SAN 等)」 4. **路人怎麼知道警證是真的?** * 路人手上本來就有一份「可信任單位清單」(好多個 `ca.crt`): * 看到警證上的鋼印 & 發證單位,去對照自己信任的 CA: * **鋼印有對到、自家信任的 CA 有簽過 → 警證是真的,信任這位警察。** * **鋼印對不起來、CA 不在信任清單裡 → 警證不可信,可能是假警察。** 👉 這就是一般 HTTPS 的模式: **Client 只驗證 Server(瀏覽器驗網站),不一定要求 Client 出示憑證。** --- ### 結局 2:真警察 vs 假路人 ➡️「Server 驗證 Client 憑證」(mTLS / Client Certificate) 1. **警察(Server)主動要求路人出示身分證:** > 「請出示你的身分證(`client.crt`)。」 2. **警察把身分證拿去對資料庫(CA / 戶政系統)查:** * 比對: * 姓名、照片、出生年月日、身分證號 → 是否與真實紀錄一致? * 憑證是否由可信任的 CA 核發? * 憑證有沒有過期、被註銷? 3. **如果發現是假身分證:** * 資料庫查不到、或內容明顯不符 → 判定「假路人 / 假身份」。 * 真實世界:**警察可以當場逮捕。** * TLS 世界:**Server 直接中斷連線,拒絕這個 Client。** > 底下的影片就是這個概念的生活版: > - [[YouTube] 俄羅斯女孩在沙灘上飲酒,向警員提供了假身份證,被美國警察逮捕](https://youtu.be/8VOB_0tknhQ?si=9Zj7VNMnQpAvO06h) > > 路人拿假 ID 給警察 → 被查出來 → 被逮捕。 > 在 TLS 裡,就是「Client 拿假憑證 / 不被信任 CA 簽的憑證 → 被 Server 拒絕」。 --- ### 一句話總結 * **結局 1:瀏覽器怕遇到假網站 → 先確認「你真的是警察嗎?」(Client 驗 Server 憑證)** * **結局 2:網站怕遇到假用戶 → 要求「你證明你是誰」。(Server 驗 Client 憑證 / mTLS)** 如果你要,我可以幫你再改成「簡報版一頁」文字,或是加一張「驗證流程」的 ASCII 流程圖,方便丟給同事看。 <br> --- ## 討論 ### tls.crt, tls.key, ca.crt 三者如何作用? - ### gpt-5 (2025/11/13) 這三個檔案是 TLS(Transport Layer Security,傳輸層安全性協定)憑證體系的核心組件,三者各自有不同的角色與用途,以下是完整解析: --- ### 🧩 一、`tls.crt` — 伺服器的公開憑證 (Public Certificate) #### 📘 內容 * 含有伺服器的 **公開金鑰 (public key)**。 * 由 **CA(Certificate Authority,憑證簽發單位)** 簽章,證明這個伺服器的身份。 * 通常是 PEM 格式 (`-----BEGIN CERTIFICATE-----` 開頭)。 #### 🔍 作用 * 當客戶端(例如瀏覽器、API 客戶端)連線時,伺服器會將這份憑證送給客戶端。 * 客戶端用這份憑證驗證「這台伺服器是不是我信任的對象」。 * 同時用裡面的公開金鑰來建立加密通道。 --- ### 🔑 二、`tls.key` — 伺服器的私鑰 (Private Key) #### 📘 內容 * 對應於 `tls.crt` 裡的公開金鑰。 * 用於**簽署與解密**通訊。 * 嚴格保密,**只能由伺服器持有**。 #### 🔍 作用 * 伺服器利用私鑰解密 TLS 握手階段的對稱金鑰。 * 伺服器使用私鑰簽署握手資料,以證明它確實擁有這份憑證。 #### ⚠️ 注意 * 如果 `tls.key` 外洩,攻擊者即可偽裝成該伺服器。 * 通常檔案權限設為 600(僅 root 可讀)。 --- ### 🏛️ 三、`ca.crt` — 憑證簽發者的憑證 (CA Certificate) #### 📘 內容 * 這是簽發伺服器憑證 (`tls.crt`) 的憑證頒發機構 (CA) 的公開憑證。 * 通常是中繼 CA 或根 CA 的憑證。 #### 🔍 作用 * 客戶端利用它來**驗證伺服器的憑證鏈 (certificate chain)**。 * 若伺服器的 `tls.crt` 是由這個 CA 簽署的,驗證才會通過。 * 在內部系統(如 Kubernetes webhook、mutating webhook)中,`ca.crt` 常用於: * 客戶端(Kube API server)驗證 webhook server 的身份。 * 伺服器與客戶端雙向 TLS(mTLS)時,互相驗證對方憑證。 --- ### 🔄 四、三者的關係與流程圖 ```mermaid flowchart LR subgraph CA A1[ca.key<br/>CA 私鑰] A2[ca.crt<br/>CA 憑證] end subgraph Server B1[tls.key<br/>伺服器私鑰] B2[tls.crt<br/>伺服器憑證] end A1 -->|簽署| B2 A2 -->|驗證簽章| B2 Client-->|使用 ca.crt 驗證伺服器的 tls.crt|Server Server-->|使用 tls.key 解密與簽章|Client ``` --- ### 🧠 五、Kubernetes 實例 在 Kubernetes 中,若你部署一個 webhook service: * `tls.crt`、`tls.key`:由 webhook server 持有,用於 HTTPS。 * `ca.crt`:放入 Kubernetes API Server 的 `MutatingWebhookConfiguration` 或 `ValidatingWebhookConfiguration` 中,讓 K8s 驗證該 webhook 的憑證。 ```yaml webhooks: - name: mywebhook.example.com clientConfig: service: name: mywebhook namespace: default path: /validate caBundle: <base64 編碼的 ca.crt> ``` --- 是否要我幫你畫出 **雙向 TLS (mTLS)** 的完整握手圖(含 client.crt / client.key)? 那會更清楚兩端如何互相驗證。 <br> --- ### 畫出雙向 TLS (mTLS) 的完整握手圖(含 client.crt / client.key) - ### gpt-5 (2025/11/13) 這裡是 **雙向 TLS(mutual TLS, mTLS)** 的完整關係與握手過程圖解。 --- ### 🧩 一、檔案組成(雙方各自持有) | 角色 | 檔案名稱 | 內容 | 功能 | | -------------------- | ------------ | ----- | ----------------------- | | 🖥️ **伺服器 (Server)** | `tls.crt` | 公開憑證 | 告訴客戶端「這是誰」 | | | `tls.key` | 私鑰 | 用於簽署與解密 | | | `ca.crt` | CA 憑證 | 用來驗證客戶端的憑證 (client.crt) | | 💻 **客戶端 (Client)** | `client.crt` | 公開憑證 | 告訴伺服器「我是誰」 | | | `client.key` | 私鑰 | 用於簽署與解密 | | | `ca.crt` | CA 憑證 | 用來驗證伺服器的憑證 (tls.crt) | --- ### 🔐 二、mTLS 驗證流程圖 ```mermaid sequenceDiagram participant Client participant Server participant CA as Certificate Authority Note over Client,Server: 事前 — 憑證簽發階段 CA->>Server: 簽發 tls.crt (伺服器憑證) CA->>Client: 簽發 client.crt (客戶端憑證) Note over Client,Server: 連線開始 — TLS 握手流程 Client->>Server: ClientHello(支援的協議與加密套件) Server->>Client: ServerHello(選擇加密套件) Server->>Client: 傳送 tls.crt(伺服器憑證) Client->>CA: 驗證伺服器憑證(用 ca.crt) Client->>Server: 傳送 client.crt(客戶端憑證) Server->>CA: 驗證客戶端憑證(用 ca.crt) Note over Client,Server: 雙方互信通過 Client->>Server: 產生並加密 session key Server->>Client: 用 tls.key 解密 session key Note over Client,Server: 雙方建立對稱加密通道 Client-->>Server: 加密的應用層資料傳輸 ``` --- ### 🧠 三、作用重點整理 | 檔案 | 說明 | 所屬端 | | ------------ | --------------------------------- | ---- | | `tls.crt` | 伺服器公開憑證,供客戶端驗證 | 伺服器 | | `tls.key` | 對應伺服器憑證的私鑰,用於簽署/解密 | 伺服器 | | `ca.crt` | 憑證頒發機構的公開憑證,用於驗證 client/server 憑證 | 雙方都有 | | `client.crt` | 客戶端公開憑證,供伺服器驗證 | 客戶端 | | `client.key` | 對應客戶端憑證的私鑰 | 客戶端 | --- ### 🧾 四、實務範例 — Kubernetes Webhook 的 mTLS Webhook Server 端: ```yaml apiVersion: v1 kind: Secret metadata: name: webhook-tls type: kubernetes.io/tls data: tls.crt: <base64> tls.key: <base64> ca.crt: <base64> # 用於驗證 client(如 kube-apiserver) ``` Kube API Server 在 `MutatingWebhookConfiguration` 中: ```yaml webhooks: - name: mywebhook.example.com clientConfig: caBundle: <base64 of ca.crt> ``` 👉 意義: * webhook server 用 `tls.key` 與 `tls.crt` 提供 HTTPS。 * kube-apiserver 用 `ca.crt` 驗證 webhook server 的真實性。 * 若開啟 mTLS,webhook server 也可要求 kube-apiserver 出示 client 憑證以驗證對方。 --- 是否希望我接著幫你畫出 **「單向 TLS」 vs 「雙向 TLS」的比較圖表**(一眼看懂差別)? <br> --- ### 畫出 「單向 TLS」 vs 「雙向 TLS」的比較圖表 - ### gpt-5 (2025/11/13) 以下是 **「單向 TLS」與「雙向 TLS (mTLS)」** 的完整比較說明與對照圖表,幫助你一眼看懂差別 👇 --- ### 🧭 一、概念總覽 | 項目 | 單向 TLS (One-way TLS) | 雙向 TLS (Mutual TLS, mTLS) | | -------- | ------------------------------ | ------------------------------ | | **驗證方向** | ✅ 客戶端驗證伺服器<br>❌ 伺服器不驗證客戶端 | ✅ 雙方互相驗證身份 | | **使用場景** | 網頁瀏覽 (HTTPS)、API 公開端點 | 內部微服務通訊、Webhook、零信任架構 | | **客戶端是否需憑證** | ❌ 不需要 | ✅ 需要 (client.crt / client.key) | | **安全層級** | 一般安全(防竊聽與偽造伺服器) | 高安全(防中間人攻擊與未授權客戶端) | | **憑證需求** | `tls.crt`, `tls.key`, `ca.crt` | + `client.crt`, `client.key` | | **TLS 握手流程** | 單向認證 | 雙向認證 | --- ### 🔐 二、握手流程圖比較 #### 🧩 單向 TLS(常見於 HTTPS) ```mermaid sequenceDiagram participant Client participant Server participant CA as Certificate Authority Note over Client,Server: 單向 TLS 驗證流程 Client->>Server: ClientHello Server->>Client: ServerHello + tls.crt Client->>CA: 用 ca.crt 驗證 tls.crt Client->>Server: 建立對稱金鑰 (encrypted with server public key) Server->>Client: 用 tls.key 解密對稱金鑰 Note over Client,Server: ✅ 建立加密通道<br>❌ 伺服器不驗證客戶端 ``` 📘 **說明**: * 瀏覽器或 API client 驗證伺服器憑證是否合法。 * 伺服器不用知道「客戶端是誰」,只要能提供服務即可。 --- #### 🔒 雙向 TLS(mTLS) ```mermaid sequenceDiagram participant Client participant Server participant CA as Certificate Authority Note over Client,Server: 雙向 TLS 驗證流程 Client->>Server: ClientHello Server->>Client: ServerHello + tls.crt Client->>CA: 驗證伺服器憑證 (tls.crt) Server->>Client: 要求客戶端憑證 (client.crt) Client->>Server: 傳送 client.crt Server->>CA: 驗證 client.crt Note over Client,Server: ✅ 雙方互信通過 Client->>Server: 建立 session key Note over Client,Server: 🔐 安全通道建立完成 ``` 📘 **說明**: * 雙方都由 **同一個或信任的 CA** 簽發憑證。 * 伺服器與客戶端都確定對方是可信任實體。 * 常用於: * 金融交易 API * Kubernetes Webhook * 企業內部微服務間通訊 --- ### 🧠 三、實務重點總結 | 比較項 | 單向 TLS | 雙向 TLS | | ----- | ------- | -------- | | 加密資料傳輸 | ✅ | ✅ | | 防止假冒伺服器 | ✅ | ✅ | | 防止假冒客戶端 | ❌ | ✅ | | 適合用於 | 公開服務(HTTPS, REST API) | 內網、零信任系統、Webhook | | 憑證配置 | 伺服器:`tls.crt` + `tls.key` + `ca.crt` | 客戶端 + 伺服器各持憑證與私鑰 | | 驗證階段 | 客戶端驗伺服器 | 伺服器與客戶端互驗 | --- ### 🧩 四、實例場景比較 | 場景 | 用法 | 原因 | | ---------------------------------- | ------ | ---------------------- | | 🌐 使用者瀏覽網站 (`https://bank.com`) | 單向 TLS | 使用者需確保網站真實可信 | | 🔄 Kubernetes API ↔ Webhook Server | 雙向 TLS | 雙方互信,避免未授權 webhook 攻擊 | | 💳 銀行內部交易 API | 雙向 TLS | 每個服務皆需身份驗證 | | ☁️ 外部 REST API (開放式) | 單向 TLS | 用 token / OAuth 控制存取即可 | --- 是否希望我接著幫你補上 👉「如何在 Kubernetes 環境中實際配置 mTLS(含 Secret、Deployment、Webhook YAML 範例)」? 這樣你可以直接套用到實務部署。 <br> --- ### 驗證 tls.crt & client.crt,是真的向 CA 連線請求驗證? - ### gpt-5 (2025/11/13) 非常好的問題 👏 這是許多人第一次接觸 TLS / mTLS 時最常誤會的地方。 結論先講: > 🚫 **驗證 `tls.crt` 或 `client.crt` 時,不會主動連線到 CA 伺服器。** > ✅ 驗證是 **本地(local)完成的**,依靠「CA 憑證 (`ca.crt`)」與「數位簽章驗證」機制。 --- ### 🧩 一、憑證驗證的原理:簽章驗證,不是線上查詢 #### 📘 簡化流程 1. **每一張憑證(例如 `tls.crt`)都包含**: * 憑證持有者資訊 (Subject) * 簽發者資訊 (Issuer) * 公開金鑰 (Public Key) * CA 的數位簽章 (Digital Signature) 2. **當客戶端收到伺服器的憑證 (`tls.crt`) 時**: * 不會去「問 CA 伺服器」。 * 而是用本機儲存的 CA 公開憑證 (`ca.crt`) 進行**數位簽章驗證**: * 用 `ca.crt` 的公開金鑰去驗證 `tls.crt` 的簽章是否正確。 * 驗證通過 → 表示這張憑證確實是由該 CA 簽發,沒有被竄改。 --- ### 🧮 二、數位簽章驗證的邏輯(簡化版) ```text 1️⃣ CA 使用它的私鑰 ca.key 對伺服器憑證的雜湊值簽章 → 產生數位簽章 2️⃣ 伺服器將簽章附在 tls.crt 內 3️⃣ 客戶端用 ca.crt(CA 的公開金鑰)驗證簽章 4️⃣ 若簽章一致 → 憑證合法 ``` 這整個過程是本地驗證,不需要上網查詢。 --- ### 🌐 三、那「線上查詢 CA」什麼時候會發生? 有一個例外:**撤銷驗證(revocation check)** 當伺服器或客戶端的憑證被吊銷(例如金鑰外洩)時,CA 會發佈: * **CRL (Certificate Revocation List)**:憑證撤銷清單 * **OCSP (Online Certificate Status Protocol)**:線上狀態查詢協定 這兩種情況才可能「連線到 CA 或 OCSP 伺服器」: * 驗證端會查詢該憑證是否被撤銷。 * 但這是額外步驟,不是 TLS 驗證的必要條件。 多數系統可設定要不要開啟 OCSP 驗證。 --- ### 🧠 四、在實務上(舉例) | 環境 | 是否連線 CA | 說明 | | ---- | --------- | --- | | 瀏覽器連線 HTTPS 網站 | ❌ 不會直接問 CA | 驗證用作業系統內建的根憑證庫 | | Kubernetes API Server 驗證 webhook | ❌ 本地使用 caBundle | 沒有網路查詢步驟 | | OpenSSL `verify` 指令驗證憑證 | ❌ 只用本地 `ca.crt` | 全程離線驗證 | | 啟用 OCSP 驗證的瀏覽器 | ✅ 可能短暫連線 OCSP responder | 查詢憑證是否被撤銷 | --- ### 🔐 五、總結一句話 | 問題 | 答案 | | ---- | ---- | | 驗證 `tls.crt` 或 `client.crt` 時,會連線 CA 嗎? | ❌ 不會 | | 驗證依據是什麼? | 本地 `ca.crt` 公開金鑰 + 數位簽章驗證 | | 什麼時候會線上查詢 CA? | 只有做撤銷查詢(OCSP / CRL)時才會 | --- 如果你想,我可以幫你畫出「TLS 驗證 vs 憑證撤銷查詢」的比較流程圖,一目了然整個差異,要嗎? <br> --- ### 用 `ca.crt` 的公開金鑰去驗證 `tls.crt` 的簽章是否正確,這件事如何進行? - ### gpt-5 (2025/11/13) 非常棒的追問,這是 TLS/PKI 的核心問題之一 👍 我們現在要深入到「**憑證簽章驗證的數學過程**」層面,說明 **ca.crt 的公開金鑰** 如何驗證 **tls.crt 的簽章**。 --- ### 🧩 一、先了解憑證結構 一張憑證(例如 `tls.crt`)內部大致包含: | 區塊 | 說明 | | ----------------------- | ------------------------------------- | | **TBS (To Be Signed)** | 「待簽章」內容,包含憑證主體資訊(Subject, 公開金鑰, 有效期等) | | **Signature Algorithm** | 簽章演算法(例如 `sha256WithRSAEncryption`) | | **Signature Value** | 真正的數位簽章(由 CA 用它的私鑰計算出來) | 這三部分合起來才是完整的憑證。 --- ### 🔐 二、CA 簽發憑證時發生的事 1️⃣ CA 先計算 TBS 部分的雜湊值 ``` hash = SHA256(TBS) ``` 2️⃣ CA 用它的 **私鑰 (ca.key)** 對這個雜湊值加密,產生「數位簽章」: ``` signature = Encrypt_with_CA_PrivateKey(hash) ``` 3️⃣ 這個 `signature` 會被附加在 `tls.crt` 裡面。 所以整張憑證帶有「由 CA 簽署」的證據。 --- ### 🧮 三、驗證時(使用 ca.crt 的公開金鑰) 驗證方(例如客戶端)要確認 `tls.crt` 沒被竄改、且真的是由 CA 簽發,就做這三步: 1️⃣ 從 `tls.crt` 取出: * TBS 部分 * 簽章 (`signature`) 2️⃣ 用相同雜湊演算法重新計算 TBS 的雜湊值: ``` hash_calculated = SHA256(TBS) ``` 3️⃣ 用 **CA 的公開金鑰 (ca.crt)** 解密憑證中的簽章: ``` hash_from_signature = Decrypt_with_CA_PublicKey(signature) ``` 4️⃣ 比較兩者是否相同: ``` if hash_calculated == hash_from_signature: 驗證成功(確定由該 CA 簽發且內容未被改動) else: 驗證失敗(被竄改或非該 CA 簽署) ``` --- ### 🔢 四、以 RSA 為例(具體演算法) 假設 CA 用 RSA 簽署: * CA 持有私鑰 `(n, d)` * ca.crt 含有公開金鑰 `(n, e)` **簽章時**: ``` signature = (SHA256(TBS))^d mod n ``` **驗證時**: ``` hash_from_signature = (signature)^e mod n → 若等於 SHA256(TBS),代表簽章正確 ``` --- ### 🔍 五、驗證的意義 這樣的數位簽章機制能同時達成: 1. **防竄改**:TBS 若被修改,hash 值不符,驗證失敗。 2. **防偽造**:只有 CA 的私鑰能產生該簽章。 3. **身份驗證**:因為能用 `ca.crt`(CA 公開金鑰)驗證,代表該憑證來自該 CA。 --- ### 🧠 六、總結一句話 > 用 `ca.crt` 的公開金鑰解開 `tls.crt` 內的數位簽章, > 再比對憑證內容的雜湊值,若一致 → 確認此憑證未被竄改、且確實由該 CA 簽發。 --- 如果你想,我可以再畫一張簡單的 **「簽章產生 vs 驗證流程圖(含 RSA 運算方向)」**,讓整個過程更直覺地視覺化,要我畫嗎? <br> --- ### CA 憑證用途? - ### gpt-5 (2025/11/06) 下面用最精簡的方式說明 CA(Certificate Authority)憑證的用途與重點—— ### CA 憑證是什麼? 用來「簽發與簽章」其他憑證的上游信任來源。作為信任鏈的根或中繼,負責證明某張伺服器/用戶/程式碼憑證是可信的。 ### 常見用途(做什麼用) * **網站/伺服器驗證(HTTPS/TLS)**:瀏覽器用 CA 信任鏈確認你連到的真的是該網站。 * **用戶/服務互認(mTLS)**:雙向 TLS,中台/微服務、K8s/Service Mesh 常用。 * **程式碼簽章**:簽 Mac/Windows 可執行檔、容器映像簽章(延伸到 Cosign/Sigstore 生態)。 * **Email 簽章與加密(S/MIME)**:確保寄件者身分與內容未被竄改。 * **文件簽章**:PDF 等電子簽章。 * **VPN / IPSec / Wi-Fi EAP**:裝置與伺服器身分驗證。 * **IoT/裝置身分**:大量裝置出廠時燒錄裝置憑證,由私有 CA 簽發。 * **企業內部服務**:資料庫 TLS(如 MariaDB/PostgreSQL 的 server/client cert)、Git/私有服務端點。 ### 與「一般伺服器憑證」的差別 * **CA 憑證**:用來「簽發/簽章」別人的憑證,不直接拿來對外服務。 * **伺服器/客戶端憑證**:被 CA 簽出的「終端憑證」,用於實際連線身分驗證與加密。 ### 信任鏈與種類 * **Root CA(自簽)** → **Intermediate CA** → **End-entity(伺服器/客戶端)** 公有 CA(瀏覽器信任庫內) vs. 私有 CA(公司/專案內用)。也可做**交叉簽章**提高相容性。 ### 憑證技術要點(X.509) * **BasicConstraints**:`CA:TRUE` 才能當 CA。 * **KeyUsage**:CA 需含 `keyCertSign`、`cRLSign`;終端憑證依用途含 `digitalSignature`、`keyEncipherment` 等。 * **EKU(Extended Key Usage)**:如 `serverAuth`、`clientAuth`、`codeSigning`、`emailProtection`。 ### 管理與營運重點(實務) * **私鑰保護**:Root/Intermediate CA 建議離線或用 HSM。 * **撤銷與狀態發布**:維護 CRL/OCSP,事件時能快速作廢。 * **壽期與輪替**:規劃到期前換發、金鑰輪替、信任鏈更新。 * **最小授權**:Root 只簽中繼,中繼再簽服務,降低風險。 * **Pinning(選用)**:對高安全場景做憑證/公鑰固定,但需妥善輪替策略。 ### K8s / 雲原生常見場景 * **Service Mesh(Istio/Linkerd)**:內建 CA 簽發 mTLS 憑證給 pod。 * **K8s 元件**:kubelet、webhook、API Server 間 TLS。 * **資料庫**:MariaDB/PostgreSQL 啟用 TLS,伺服器與客戶端憑證由內部 CA 簽發,支援 mTLS。 ### 快速檢查與示例 * 檢視是否為 CA: ```bash openssl x509 -in ca.crt -noout -text | grep -A2 "Basic Constraints" ``` * 檢查可否簽憑證: ```bash openssl x509 -in ca.crt -noout -text | grep -A3 "Key Usage" ``` * 以私有 CA 簽一張伺服器憑證(簡化流程): 1. 產 CSR:`openssl req -new -key server.key -out server.csr` 2. CA 簽發:`openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 365 -extfile ext.cnf` 需要我幫你針對你的場景(例如 MariaDB、K8s mTLS 或公司內部私有 CA 架構)出一份實作與輪替 SOP 嗎? <br> {%hackmd vaaMgNRPS4KGJDSFG0ZE0w %}