---
# System prepended metadata

title: 憑證是什麼？中華電信發生什麼事？
tags: [HTTPS, "Digital Certificate\_"]

---

# 憑證是什麼？中華電信發生什麼事？
> 最近因為Google撤銷中華電信憑證的信任，導致很多網站出現不安全警示，來仔細了解一下憑證是什麼吧！
> {%preview https://www.cna.com.tw/news/afe/202506170307.aspx %}
> {%preview https://tw.news.yahoo.com/google%E6%92%A4%E9%8A%B7%E4%B8%AD%E8%8F%AF%E9%9B%BB%E4%BF%A1%E6%86%91%E8%AD%89%E4%BF%A1%E4%BB%BB-%E8%91%A3%E4%BA%8B%E9%95%B7%E5%85%AC%E9%96%8B%E9%81%93%E6%AD%89%E6%8F%90-8%E5%A4%A7%E6%94%B9%E5%96%84-083246042.html %}
> {%preview https://www.ithome.com.tw/news/169441 %}

# HTTPS連線流程概述
> 在了解憑證是什麼之前，先來看一下HTTPS連線流程
1. DNS 解析
    - 使用者輸入網址（如 example.com）
    - 透過 DNS 查出對應 IP（例：142.250.xx.xx）
2. TCP 三次握手
    - Client 傳送 SYN → Server
    - Server 回 SYN-ACK → Client
    - Client 傳 ACK → Server
3. TLS 握手與憑證驗證
    ✨ **這是 HTTPS 安全性的關鍵所在，詳述於下方。**
4. HTTP 請求與回應
    - Client 發送加密的 GET/POST 請求
    - Server 回應加密的資料（HTML/JSON 等）
5. 連線終止
    - TLS 層結束加密通道 → TCP 四次揮手關閉連線

# 數位憑證與 TLS 驗證流程
> 先來說明三個重要的角色:
> - 🧑‍💻 Client
>     - 使用者的瀏覽器或 App，主動發起連線，驗證憑證
>     - e.g. Chrome、Safari、Postman、cURL
> - 🖥️ Server
>     - 你所架設的網站或 API 伺服器，提供 HTTPS 連線與服務
>     - e.g. Nginx、Apache、Vercel、CloudFront
> - 🏛️ CA（Certificate Authority）
>     - 負責簽發、驗證網站憑證的第三方信任機構
>     - e.g. Let’s Encrypt、DigiCert、中華電信

## 憑證申請與簽發（Server 端 + CA 端作業）

🖥️ Server：
1. 產生一對 RSA 金鑰（私鑰 privkey.pem + 公鑰）
    ```bash
    openssl genrsa -out privkey.pem 2048
    ```
2. 根據私鑰產生一份 CSR（憑證簽署請求），內含：
	- 公鑰
	- 網域資訊（如 example.com）
	```bash
    openssl req -new -key privkey.pem -out cert.csr
    ```
3. 將 cert.csr 提交給 CA（例如中華電信、Let’s Encrypt、DigiCert）

🏛️ CA：
1. 網域所有權驗證（防止偽造）
    - DNS 驗證：新增 TXT 紀錄
    - HTTP 驗證：上傳驗證檔案至指定網址
    - Email 驗證：確認信箱
2. 驗證成功後，CA：
	- 用「中介 CA 的私鑰」對 CSR 進行數位簽章
	- 產出你的網站憑證（Server Certificate）
3. CA 將憑證組合後回傳完整 憑證鏈 給你：
	- Server Certificate（你網站的憑證）
	- Intermediate Certificate（中介 CA）

## 憑證部署（Server 端）：
- 將憑證鏈與私鑰部署至 Web Server（如 Nginx）
- 設定範例如下：
    ```nginx
    ssl_certificate     fullchain.pem;  # 包含網站憑證 + 中介憑證
    ssl_certificate_key privkey.pem;   # 你自己的私鑰
    ```
- Cloud service（如 Vercel、CloudFront）會幫你自動完成這步（包含自動續期）

⸻

## 憑證驗證流程（Client 端）

🌐 當使用者的瀏覽器連上網站時，Server 回傳：
- Server Certificate（你的網站憑證）
- Intermediate Certificate（由 CA 提供）

🔍 Browser 驗證流程（憑證鏈）：
1. 用 Root CA 的公鑰驗證中介憑證的簽名
2. 用中介憑證的公鑰驗證你的網站憑證
3. 驗證成功 → HTTPS 建立
4. 若任一層驗證失敗（格式錯誤、Root 不被信任、過期等） → 顯示「不受信任的網站」錯誤

# 中華電信事件是哪個環節出錯了呢？
Chrome 宣布自 2025 年 8 月 1 日起 不再信任 中華電信 Root CA，意味著所有由中華電信簽出的憑證（即使合法）都會失效，用戶端憑證鏈驗證失，會導致HTTPS 建立失敗，出現不安全警示畫面，我們可以換用受信任的 CA，如 Let’s Encrypt、DigiCert 等來解決此問題

# 如何查詢此網站的的憑證是用哪個CA呢？
可以用 openssl 或 Chrome 開發者工具看你目前網站使用的憑證鏈，這邊用我個人網站chih-han為例：
```bash
openssl s_client -connect chih-han.com:443 -showcerts
```
結果如下：
```bash
Certificate chain
 0 s:CN=chih-han.com
   i:C=US, O=Let's Encrypt, CN=R10
 1 s:C=US, O=Let's Encrypt, CN=R10
   i:C=US, O=Internet Security Research Group, CN=ISRG Root X1
```

