數位憑證是網路世界的「身分證」,解決**竊聽、偽裝、篡改、抵賴**四大威脅。本文系統說明 X.509 結構、CA 運作流程、公開金鑰基礎建設(PKI)、常見檔案格式(.cer/.pfx/.p12)、USB Key 雙因子認證,以及 C# 實務應用場景。
四大威脅與對策
| 威脅 | 對策 | 技術手段 |
| 竊聽 | 機密性 | 公開金鑰加密 / 對稱加密混合 |
| 偽裝 | 鑑別授權 | CA 驗證憑證有效性 |
| 篡改 | 完整性 | 雜湊演算法 / 數位簽章 |
| 抵賴 | 不可否認性 | CA 法律效力 / 時間戳記 |
非對稱加密核心流程
- 雙方各自擁有 私鑰(不公開) + 公鑰(公開)。
- A 傳訊息給 B:用 **B 的公鑰加密** → 只有 B 的私鑰能解密。
- A 簽署訊息:用 **A 的私鑰簽章** → 任何人用 A 的公鑰驗證 → 確認來源未竄改。
- 實務採用 **混合加密**:對稱金鑰加密大量資料 + 非對稱加密保護對稱金鑰。
CA(Certificate Authority)信任鏈
Root CA (離線根憑證,自簽)
└─ Intermediate CA (簽發伺服器/用戶憑證)
└─ Server Certificate (www.example.com)
└─ Client Certificate (用戶/員工)
- 瀏覽器/作業系統內建 **受信任根憑證存放區**,驗證鏈路至根。
- 12306 購票憑證、銀行 USB Key 皆屬此架構。
憑證結構關鍵欄位
| 欄位 | 說明 |
| Subject (CN) | 擁有者名稱(網域、人名、組織) |
| Issuer | 簽發者 CA 名稱 |
| Valid From / To | 有效期限 |
| Public Key | 公開金鑰(RSA 1024/2048/4096、ECC) |
| Signature Algorithm | 簽章演算法(sha256RSA 等) |
| Thumbprint | SHA1 雜湊指紋,唯一識別 |
| Key Usage | 金鑰用途(加密、簽章、金鑰交換) |
| Enhanced Key Usage | 擴展用途(Server Auth、Client Auth、Code Signing、Email Protection) |
常見檔案格式
.cer / .crt / .der:僅含**公開鑰**,可公開散布。
.pfx / .p12:含**私鑰+公開鑰**,受密碼保護,**極機密**。
.pem:Base64 編碼文本格式,Linux/OpenSSL 常用。
五大憑證類型與應用
| 類型 | 用途 | 典型場景 |
| 伺服器憑證 | SSL/TLS 加密、證明網站身分 | HTTPS、API Gateway |
| 用戶端個人憑證 | 雙因子認證(USB Key + PIN)、數位簽章 | 網銀、報稅、電子簽約 |
| 電子郵件憑證 | S/MIME 簽章/加密郵件 | 企業機密郵件 |
| 代碼簽署憑證 | Authenticode 簽署 .exe/.msi/.dll | Windows SmartScreen 信任、驅動程式簽署 |
| 企業/文件憑證 | 法人實體簽章、PDF 數位簽章 | 電子發票、合約簽署 |
C# 實務操作
using System.Security.Cryptography.X509Certificates;
// 1. 從存放區載入
var store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadOnly);
var certs = store.Certificates.Find(X509FindType.FindByThumbprint, "abc123...", false);
var cert = certs[0];
// 2. 從 PFX 載入(含私鑰)
var cert2 = new X509Certificate2("user.pfx", "password", X509KeyStorageFlags.MachineKeySet);
// 3. 加密(用公開鑰)
byte[] Encrypt(byte[] data, X509Certificate2 cert) {
using var rsa = cert.GetRSAPublicKey();
return rsa.Encrypt(data, RSAEncryptionPadding.OaepSHA256);
}
// 4. 解密/簽章(需私鑰)
byte[] Sign(byte[] data, X509Certificate2 cert) {
using var rsa = cert.GetRSAPrivateKey();
return rsa.SignData(data, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1);
}
// 5. 驗證簽章
bool Verify(byte[] data, byte[] sig, X509Certificate2 cert) {
using var rsa = cert.GetRSAPublicKey();
return rsa.VerifyData(data, sig, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1);
}
建立測試憑證
- Windows SDK:
makecert.exe(舊)、New-SelfSignedCertificate (PowerShell 現代)
- OpenSSL:
openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 365
- IIS 管理員 → 伺服器憑證 → 建立自我簽署憑證
避坑提醒
- **私鑰不可外洩**:PFX 檔案等同身分證+印章,嚴禁 commit 到 Git、傳輸明文郵件。
- **憑證到期前輪換**:建立監控告警,自動化續簽(ACME/Let's Encrypt/內部 CA)。
- **金鑰長度**:RSA < 2048 已不安全,建議 2048+ 或 ECC P-256/P-384。
- **雙因子認證**:USB Key 將私鑰存於硬體安全模組(HSM),不可導出,最高安全等級。
數位憑證是資安基石。理解 X.509、CA 信任鏈、金鑰用途與檔案格式,才能在 HTTPS、簽章、加密、認證等場景做正確的架構決策。