Dot-Net

CryptographicException ‘Keyset 不存在’,但只能通過 WCF

  • March 2, 2009

我有一些程式碼可以呼叫使用 X.509 認證保護的第三方 Web 服務。

如果我直接呼叫程式碼(使用單元測試),它可以正常工作。

部署後,此程式碼將通過 WCF 服務呼叫。我添加了第二個呼叫 WCF 服務的單元測試,但是當我呼叫第三方 Web 服務上的方法時,這會失敗並顯示一條CryptographicException消息。"Keyset does not exist"

我認為這是因為我的 WCF 服務將嘗試使用與我不同的使用者來呼叫第三方 Web 服務。

任何人都可以對這個問題有更多的了解嗎?

這可能是證書上的權限問題。

執行單元測試時,您將在自己的使用者上下文中執行這些測試,其中(取決於客戶端證書所在的儲存)將有權訪問該證書的私鑰。

但是,如果您的 WCF 服務託管在 IIS 下,或者作為 Windows 服務,它很可能會在服務帳戶(網路服務、本地服務或其他一些受限帳戶)下執行。

您需要在私鑰上設置適當的權限,以允許該服務帳戶訪問它。MSDN有詳細資訊

這很可能是因為 IIS 使用者無權訪問您的證書的私鑰。您可以按照以下步驟進行設置…

  1. 開始→執行→MMC
  2. 文件 → 添加/刪除管理單元
  3. 添加證書管理單元
  4. 選擇電腦帳戶,然後點擊下一步
  5. 選擇本地電腦(預設),然後點擊完成
  6. 在控制台根的左側面板上,導航到證書(本地電腦)→個人→證書
  7. 您的證書很可能會在這裡。
  8. 右鍵點擊您的證書→所有任務→管理私鑰
  9. 在此處設置您的私鑰設置。

引用自:https://stackoverflow.com/questions/602345