首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

WCF 安全核心:X.509 憑證完整指南——從產生、演算法、存儲位置到部署模式的實戰考量

     編輯:關於.NET

X.509 憑證在 WCF 安全體系中的核心地位

X.509 是 ITU-T 制定的數位憑證標準,.NET 採用 v2 版(引入主體/簽發者唯一識別碼解決重名問題)。每張憑證包含一組非對稱金鑰對:公開金鑰加密、私有金鑰解密。在 WCF 的 Message 安全、Transport 安全、憑證驗證等場景中,X.509 憑證是不可或缺的信任錨點。

1. 如何產生測試憑證

使用 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(命令列/批次檔適用)。

2. 憑證內部結構與演算法之謎

預設雜湊演算法為 MD5。若指定 SHA1:

makecert ... -a sha1 ...

檢視憑證會發現:公開金鑰加密強度 1024 位元,演算法簽名顯示 sha1RSA。原因在於 RSA 加密服務提供者(CSP)決定金鑰長度與演算法組合:

  • Microsoft Base Cryptographic Provider:384~512 位元
  • Microsoft Enhanced Cryptographic Provider(預設安裝):384~16384 位元,增量 8 位元

實測 16384 位元金鑰產生耗時近 7 分鐘。程式碼測試 RSA 加解密:

RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(16384);
byte[] data = rsa.Encrypt(encryptdata, false);
byte[] dedata = rsa.Decrypt(data, false);

3. 憑證存儲位置選擇:開發 vs 部署的關鍵差異

開發模式(Console 宿主,管理員權限)

證書放在 CurrentUser\My 即可,權限通常足夠。若驗證模式設為 PeerTrust 且憑證不在 Trusted People,會失敗。四種驗證模式:

  • None:不驗證(測試用)
  • PeerTrust:在 Trusted People 存儲區
  • ChainTrust:鏈結至 Trusted Root CA
  • PeerOrChainTrust:以上兩者其一
  • Custom:自訂 X509CertificateValidator

設為 None 可繞過存儲位置限制。

部署模式(Windows Service 宿主,強烈推薦)

Windows Service 以 LocalSystem/NetworkService/LocalService 執行,存取 LocalMachine 存儲區才穩定。核心原則:

  1. 服務端憑證必須安裝在 LocalMachine(Personal 或 Trusted People 視驗證模式而定)。
  2. 驗證模式 PeerTrust 時,憑證放 LocalMachine\TrustedPeople;ChainTrust 時放 LocalMachine\Root(或 My 亦可)。
  3. 客戶端憑證必須複製到服務端 TrustedPeople 以建立信任。
  4. 雙向驗證時,客戶端亦需信任服務端憑證鏈。

常見錯誤:嘗試用 FindPrivateKey.exe 找私鑰給 LocalService 權限——這在 Windows Service 宿主下通常無效,根因是憑證位置錯誤(放在 CurrentUser 而非 LocalMachine)。

4. 安全策略啟用時的效能權衡

非對稱加密/解密、金鑰協商、憑證驗證都有 CPU 成本。16384 位元金鑰產生 7 分鐘即是警訊。實務上:

  • 1024~2048 位元為常見平衡點。
  • Message 安全模式下,WS-SecureConversation 建立安全內容權杖(SCT)可大幅降低後續訊息加密開銷。
  • Transport 模式(HTTPS/TLS)由作業系統核心處理,效能優於訊息層加密。

總結:部署清單

項目建議設定
服務端憑證存儲LocalMachine\My (Personal) 或 TrustedPeople
客戶端憑證存儲 (服務端)LocalMachine\TrustedPeople
驗證模式生產環境建議 ChainTrust 或 PeerOrChainTrust
金鑰長度2048 位元 (RSA)
雜湊演算法SHA256 (SHA1 已淘汰)
私鑰可匯出僅測試環境設為 true,生產環境 false

SHA1 憑證屬性顯示 sha1RSA

16384 位元金鑰產生耗時

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved