Skip to main content

x509

好的,以下是一篇整合版的「X.509 與 RSA」指南。

X.509 與 RSA:從憑證到簽章的完整指南

為什麼需要這篇?

當我們談到 HTTPS、代碼簽章或裝置驗證時,幾乎一定會同時遇到兩個名詞:X.509(憑證格式/標準)與 RSA(公開金鑰密碼學演算法)。X.509 定義了憑證該怎麼長、該裝哪些欄位;RSA 則提供簽章與加解密的數學基礎。這篇文章把兩者一次說清楚,並示範它們如何在實務中搭配運作。

什麼是 X.509?

X.509 是一種 公開金鑰基礎建設 (PKI) 的標準,用來定義 數位憑證 (Digital Certificates) 的格式與驗證方式,最常見於:

  • 驗證身分(Authentication)
  • 建立安全連線(TLS/SSL,像是 HTTPS 網站)
  • 數位簽章與資料完整性

它由 ITU-TX.500 目錄服務 的標準中提出,現今網際網路的憑證幾乎都遵循 X.509 v3。

X.509 憑證的結構(重點欄位)

  1. 版本號 (Version):v3 最常見,支援擴展 (extensions)
  2. 序號 (Serial Number):由 CA 指派的唯一 ID
  3. 簽章演算法 (Signature Algorithm):例如 SHA256withRSA
  4. 發行者 (Issuer):簽發憑證的 CA
  5. 主體 (Subject):憑證持有者資訊(CN、O、C...)
  6. 有效期限 (Validity)Not Before / Not After
  7. 主體公鑰資訊 (Subject Public Key Info, SPKI):公鑰與其演算法(RSA、ECDSA...)
  8. 擴展欄位 (Extensions)
    • Key Usage:金鑰用途(簽章、加密、憑證簽發等)
    • Extended Key Usage (EKU):更細的用途(TLS Web Server AuthenticationEmail Protection
    • Subject Alternative Name (SAN):主體替代名稱(多網域 example.comwww.example.com
  9. 簽章 (Signature):由發行者(CA)的私鑰對憑證內容做的簽章

常見封裝格式

  • PEM (.pem, .crt, .cer):Base64 編碼,含 -----BEGIN CERTIFICATE-----
  • DER (.der):二進位編碼(Java/某些系統偏好)
  • PFX / PKCS#12 (.pfx, .p12):可包含憑證 + 私鑰(常用於 Windows/iOS)

什麼是 RSA?

RSA 是一種 非對稱加密演算法 (Asymmetric Cryptography),由 Rivest、Shamir、Adleman 在 1977 年提出。RSA 可用於:

  • 加密 (Encryption)
  • 數位簽章 (Digital Signature)
  • 金鑰交換 (Key Exchange,傳統 RSA key exchange 已逐漸被 ECDHE 取代)
  • 與 X.509/TLS/HTTPS 憑證搭配

RSA 的基本原理(超精簡)

  1. 選兩個大質數 pq,相乘得 n = p * qn 位數 ≈ 金鑰長度)
  2. 計算 φ(n) = (p-1)(q-1)
  3. 選公開指數 e(常用 65537
  4. 計算私鑰 d,使 e * d ≡ 1 (mod φ(n))
  5. 公鑰 = (e, n),私鑰 = (d, n)

加密/解密與簽章/驗證分別是指數運算在 n 上的相反方向(公鑰/私鑰互補)。

常見金鑰長度

  • 2048-bit:現今最常見,效能與安全平衡
  • 3072-bit:提高安全等級
  • 4096-bit:高安全場景,但效能與大小成本更高

RSA 在 X.509 中扮演的角色

X.509 是「容器與規範」,RSA 是「裡面的演算法」。兩者的連結點有:

  • 憑證欄位中的 Signature Algorithm 常見為 SHA256withRSA(表示用 SHA-256 對憑證內容雜湊,再用 RSA 私鑰簽章)
  • SPKI(主體公鑰資訊)可能是 RSA 公鑰(也可能是 ECDSA 等)
  • Key Usage / EKU 決定這把 RSA 金鑰在此憑證允許被拿來做「數位簽章」「金鑰加密」「TLS 伺服器驗證」等用途

憑證簽發時發生了什麼?

  1. 申請者產生金鑰對(例如 RSA 2048),保管私鑰,公開公鑰
  2. 申請者用公鑰與主體資訊產生 CSR(Certificate Signing Request)
  3. CA 驗證申請者的身份與域名/組織權限
  4. CA 用自己的私鑰對「憑證內容(包含申請者公鑰與主體資訊)」做簽章
  5. 產生的 X.509 憑證中:Signature Algorithm 指出使用 SHA256withRSASignature 是 CA 私鑰的簽章結果

瀏覽器驗證網站憑證的流程(TLS 觀點)

  1. 伺服器送出自己的憑證(含 RSA/ECDSA 公鑰)與憑證鍊(中繼 CA → 根 CA)
  2. 瀏覽器用上層 CA 的公鑰「驗證下層憑證的簽章」;一路往上直到信任的根 CA
  3. 憑證有效、鏈條可信後,進入金鑰協商(現今多為 ECDHE),最後建立對稱金鑰(如 AES)
  4. 若是 TLS_ECDHE_RSA,則使用 RSA 來「驗證伺服器的簽章身分」,金鑰交換由 ECDHE 負責

也就是說:現代 TLS 通常把「身分驗證(RSA 簽章)」與「金鑰交換(ECDHE)」分工處理,兼顧前向保密性與相容性。

欄位對應與設定重點(把兩者對齊)

  • Signature Algorithm:例如 SHA256withRSA,表示憑證本身是用 RSA 私鑰簽的
  • Subject Public Key Info:通常可見 RSA Public-Key: (2048 bit) 等資訊
  • Key Usage
    • Digital Signature:允許用於簽章(TLS 伺服器簽章)
    • Key Encipherment:允許用於金鑰加密(傳統 RSA key exchange 場景)
  • EKU
    • TLS Web Server Authentication:做網站伺服器端身份驗證
    • TLS Web Client Authentication:作為客戶端憑證驗證
  • SAN:網站多域名必填(現代瀏覽器依賴 SAN,不再讀 Subject CN 當 DNS)

實務指令(OpenSSL 範例)

以下範例展示 RSA 與 X.509 的最小可用流程(請在安全環境操作):

  1. 產生 RSA 私鑰(2048-bit)與對應公鑰
openssl genrsa -out server.key 2048
openssl rsa -in server.key -pubout -out server.pub.pem
  1. 產生 CSR(會問主體資訊,或用設定檔自動化)
openssl req -new -key server.key -out server.csr \
-subj "/C=TW/ST=Taiwan/L=Taipei/O=Example Corp/OU=IT/CN=example.com"
  1. 用自有的「臨時 Root CA」簽發(示範用;正式請用受信任 CA)
# 先建立一組 CA(示意)
openssl genrsa -out ca.key 4096
openssl req -x509 -new -nodes -key ca.key -sha256 -days 3650 -out ca.crt \
-subj "/C=TW/O=Example Root CA/CN=Example Root CA"

# 用 CA 簽發伺服器憑證
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial \
-out server.crt -days 825 -sha256
  1. 格式轉換(PEM ⇄ DER、打包為 PKCS#12)
# PEM → DER(憑證)
openssl x509 -in server.crt -outform der -out server.der

# 打包成 .pfx(含私鑰與憑證)
openssl pkcs12 -export -out server.pfx -inkey server.key -in server.crt -certfile ca.crt

常見問題(FAQ)

  • 為什麼 TLS 還常看到 RSA?

    • 因為 RSA 仍是非常普及的簽章演算法,許多憑證為 SHA256withRSA;不過金鑰交換多已改採 ECDHE。
  • 我該選擇 RSA 還是 ECDSA?

    • RSA 相容性極高(老舊客戶端也行),ECDSA 效能與大小佳;多數網站仍偏好 RSA,或同時提供。
  • 2048-bit 夠嗎?

    • 對大多數情境足夠;有更高安全需求可考慮 3072/4096,但要衡量效能與檔案大小影響。

小結

  • X.509 定義了數位憑證的樣貌與驗證流程;RSA 則是實現簽章/加密的常見演算法。
  • 在實務上,常見組合是「SHA256withRSA 的憑證」+「ECDHE 金鑰交換」,同時達成身分驗證與前向保密。
  • 設計與部署時,請同時關注:金鑰長度、Key Usage/EKU、SAN、鏈條信任與憑證有效期。

好的,我來介紹一下 X.509

什麼是 X.509?

X.509 是一種 公開金鑰基礎建設 (PKI) 標準,用來定義 數位憑證 (Digital Certificates) 的格式。這些憑證最常見的用途是:

  • 驗證身分(Authentication)
  • 建立安全連線(TLS/SSL,像是 HTTPS 網站)
  • 數位簽章與資料完整性

它是由 ITU-T(國際電信聯盟)在 X.500 目錄服務 的標準中提出的。

X.509 憑證的結構

一張典型的 X.509 憑證包含下列內容:

  1. 版本號 (Version)

    • v1:最早版本(很少用)
    • v2:增加了一些額外資訊(仍少用)
    • v3:最常見版本,支援擴展欄位 (extensions)
  2. 序號 (Serial Number)

    • 憑證唯一的 ID,由簽發機構(CA)設定。
  3. 簽章演算法 (Signature Algorithm)

    • CA 用來簽署憑證的演算法,例如 SHA256withRSA
  4. 發行者 (Issuer)

    • 簽發憑證的 CA (Certificate Authority)
  5. 主體 (Subject)

    • 憑證持有者的資訊,例如:

      • Common Name (CN):域名 (e.g. example.com) 或個人名稱
      • Organization (O):公司名稱
      • Country (C):國家代碼
  6. 有效期限 (Validity)

    • Not Before(生效時間)
    • Not After(失效時間)
  7. 主體公鑰資訊 (Subject Public Key Info)

    • 公開金鑰與演算法(如 RSA、ECDSA)
  8. 擴展欄位 (Extensions, v3 特有)

    • Key Usage:金鑰用途(加密、簽章、憑證簽發)
    • Extended Key Usage (EKU):更細用途,例如 TLS Web Server AuthenticationEmail Protection
    • Subject Alternative Name (SAN):多域名 (e.g. example.com, www.example.com)
  9. 簽章 (Signature)

    • 由 CA 的私鑰簽署,驗證憑證的真實性。

X.509 的常見格式

  • PEM (.pem, .crt, .cer):Base64 編碼,通常有 --BEGIN CERTIFICATE-- 標頭。
  • DER (.der):二進位格式,常見於 Java。
  • PFX / PKCS#12 (.pfx, .p12):包含憑證 + 私鑰,常用於 Windows / iOS。

應用場景

  1. HTTPS (TLS/SSL):瀏覽器透過 X.509 憑證確認伺服器身份。
  2. VPN / IoT 裝置:裝置用憑證驗證身份。
  3. Email 安全 (S/MIME):用憑證來簽署與加密郵件。
  4. 代碼簽章 (Code Signing):驗證軟體來自合法來源。

好 👍 我來幫你詳細介紹一下 RSA

🔑 什麼是 RSA?

RSA 是一種 非對稱加密演算法 (Asymmetric Cryptography),由 Rivest、Shamir、Adleman 三位學者在 1977 年提出,所以名字取自他們姓氏的首字母。

它是目前最常見的公開金鑰演算法之一,用在:

  • 加密 (Encryption)
  • 數位簽章 (Digital Signature)
  • 金鑰交換 (Key Exchange)
  • 憑證 (X.509 / TLS / HTTPS)

🔐 基本原理

RSA 的核心是數學上的「大數質因數分解困難性」。

  1. 選兩個大質數 pq

    • 相乘得到 n = p * q
    • n 的位數(例如 2048 bits)就是金鑰長度。
  2. 計算 φ(n)

    • φ(n) = (p-1)(q-1)
  3. 選擇公開指數 e

    • 常用 65537(因為運算快 & 安全)。
  4. 計算私鑰 d

    • d 是 e 在 mod φ(n) 的乘法反元素。
    • 保證 e * d ≡ 1 (mod φ(n))
  5. 公開金鑰 = (e, n) 私鑰 = (d, n)

📦 運作流程

1. 加密 / 解密

  • 加密(用公鑰):

    ciphertext = plaintext^e mod n
  • 解密(用私鑰):

    plaintext = ciphertext^d mod n

2. 簽章 / 驗證

  • 簽章(用私鑰):

    signature = hash(message)^d mod n
  • 驗證(用公鑰):

    hash(message) == signature^e mod n ?

📏 常見金鑰長度

  • 1024-bit:舊的,現在不建議
  • 2048-bit:目前最常見,安全性足夠
  • 3072-bit:更安全
  • 4096-bit:高安全需求(IoT 很少用,太慢)

🚀 RSA 的特點

優點

  • 安全性基於「質因數分解困難」
  • 廣泛應用,支援度高
  • 可以用來做加密、簽章

⚠️ 缺點

  • 速度慢(比對稱加密像 AES 慢很多)
  • 金鑰長度大(導致憑證檔案比較肥)
  • 不適合直接加密大量資料(通常只加密 session key,再用 AES 等對稱加密)

🔧 常見應用

  • HTTPS / TLS:用 RSA 驗證伺服器身份、交換 session key
  • SSH:早期支援 RSA 金鑰登入
  • PGP / GPG:電子郵件簽章與加密
  • JWT (JSON Web Token):支援 RSA-SHA256 簽章 (RS256)
  • IoT 裝置憑證:X.509 憑證中最常見的金鑰演算法之一