X.509 是 ITU-T 制定的數位憑證標準,.NET 採用 v2 版(引入主體/簽發者唯一識別碼解決重名問題)。每張憑證包含一組非對稱金鑰對:公開金鑰加密、私有金鑰解密。在 WCF 的 Message 安全、Transport 安全、憑證驗證等場景中,X.509 憑證是不可或缺的信任錨點。
使用 SDK 工具 Makecert.exe(通常在 C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin)。建議複製至獨立目錄(如 D:\cers)操作。
makecert -r -pe -$ individual -n "CN=mailSecurity" -sky exchange -sr currentuser -ss my mailSecurity.cer
參數解析:
-r:自我簽署(自行簽發)-pe:私有金鑰可匯出-$ individual:個人用途(商業用 commercial)-n "CN=...":主體名稱,必須含 CN= 前綴-sky exchange:金鑰交換用途(簽名用 signature)-sr currentuser:存儲位置(currentuser 或 localmachine)-ss my:存儲名稱(Personal 存儲區)mailSecurity.cer:輸出公開金鑰檔管理工具:mmc 加入憑證嵌入式管理單元,或 certmgr.exe(命令列/批次檔適用)。
預設雜湊演算法為 MD5。若指定 SHA1:
makecert ... -a sha1 ...
檢視憑證會發現:公開金鑰加密強度 1024 位元,演算法簽名顯示 sha1RSA。原因在於 RSA 加密服務提供者(CSP)決定金鑰長度與演算法組合:
實測 16384 位元金鑰產生耗時近 7 分鐘。程式碼測試 RSA 加解密:
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(16384);
byte[] data = rsa.Encrypt(encryptdata, false);
byte[] dedata = rsa.Decrypt(data, false);
證書放在 CurrentUser\My 即可,權限通常足夠。若驗證模式設為 PeerTrust 且憑證不在 Trusted People,會失敗。四種驗證模式:
X509CertificateValidator設為 None 可繞過存儲位置限制。
Windows Service 以 LocalSystem/NetworkService/LocalService 執行,存取 LocalMachine 存儲區才穩定。核心原則:
PeerTrust 時,憑證放 LocalMachine\TrustedPeople;ChainTrust 時放 LocalMachine\Root(或 My 亦可)。常見錯誤:嘗試用 FindPrivateKey.exe 找私鑰給 LocalService 權限——這在 Windows Service 宿主下通常無效,根因是憑證位置錯誤(放在 CurrentUser 而非 LocalMachine)。
非對稱加密/解密、金鑰協商、憑證驗證都有 CPU 成本。16384 位元金鑰產生 7 分鐘即是警訊。實務上:
| 項目 | 建議設定 |
|---|---|
| 服務端憑證存儲 | LocalMachine\My (Personal) 或 TrustedPeople |
| 客戶端憑證存儲 (服務端) | LocalMachine\TrustedPeople |
| 驗證模式 | 生產環境建議 ChainTrust 或 PeerOrChainTrust |
| 金鑰長度 | 2048 位元 (RSA) |
| 雜湊演算法 | SHA256 (SHA1 已淘汰) |
| 私鑰可匯出 | 僅測試環境設為 true,生產環境 false |

