現象:簡單的 WCF 服務在管理員身分下正常,但在一般使用者帳號下啟動時拋出 NullReferenceException,堆疊追蹤指向 HttpChannelDemuxer。
原因:WCF HTTP 通道使用 HTTP.SYS 驅動程式註冊接聽程式,HTTP.SYS 預設不允許非管理員在未明確授權的情況下註冊 URL 命名空間保留項。
httpcfg set urlacl –u https://+:8080/MyServices/ -a "D:(A;;GX;;;S-1-5-21-...)"
-u:URL 前綴,必須使用強萬用字元 +(高優先序),而非弱萬用字元 *。-a:SDDL 格式的 ACL,授予 GX (GENERIC_EXECUTE) 權限給指定使用者/群組 SID。透過 P/Invoke 呼叫 httpapi.dll 的 HttpSetServiceConfigurationAcl,建構 HTTP_SERVICE_CONFIG_URLACL_SET 結構。需以管理員身分執行,且程式碼需完全信任。
背景:PCI-DSS 3.6.6 要求密鑰由 2-3 人分持,每人僅知部分,湊齊才能重建完整密鑰。
缺點:任一人遺失金鑰,資料永不可復原。更進階的 Shamir 秘密分享可解決此問題(文中提及留待後續專欄)。
RNGCryptoServiceProvider 產生密碼學安全隨機數(優於 System.Random)。SplitSecret(byte[], int) 回傳 List<byte[]>。JoinSecret(List<byte[]>) 還原原始位元組陣列。將分割後的 Base64 編碼金鑰寫入多個 USB 隨身碟(mysecret.txt),還原時讀取所有碟片合併。實際部署時應由程式自動收集金鑰解密,避免人工看見明文。