Dot-Net
CryptographicException ‘Keyset 不存在’,但只能通過 WCF
我有一些程式碼可以呼叫使用 X.509 認證保護的第三方 Web 服務。
如果我直接呼叫程式碼(使用單元測試),它可以正常工作。
部署後,此程式碼將通過 WCF 服務呼叫。我添加了第二個呼叫 WCF 服務的單元測試,但是當我呼叫第三方 Web 服務上的方法時,這會失敗並顯示一條
CryptographicException消息。"Keyset does not exist"我認為這是因為我的 WCF 服務將嘗試使用與我不同的使用者來呼叫第三方 Web 服務。
任何人都可以對這個問題有更多的了解嗎?
這可能是證書上的權限問題。
執行單元測試時,您將在自己的使用者上下文中執行這些測試,其中(取決於客戶端證書所在的儲存)將有權訪問該證書的私鑰。
但是,如果您的 WCF 服務託管在 IIS 下,或者作為 Windows 服務,它很可能會在服務帳戶(網路服務、本地服務或其他一些受限帳戶)下執行。
您需要在私鑰上設置適當的權限,以允許該服務帳戶訪問它。MSDN有詳細資訊
這很可能是因為 IIS 使用者無權訪問您的證書的私鑰。您可以按照以下步驟進行設置…
- 開始→執行→MMC
- 文件 → 添加/刪除管理單元
- 添加證書管理單元
- 選擇電腦帳戶,然後點擊下一步
- 選擇本地電腦(預設),然後點擊完成
- 在控制台根的左側面板上,導航到證書(本地電腦)→個人→證書
- 您的證書很可能會在這裡。
- 右鍵點擊您的證書→所有任務→管理私鑰
- 在此處設置您的私鑰設置。