[WCF] 透過 IIS 7 架設需存取憑證的 WCF 服務時遇到 Keyset does not exist 的參考解法

有些服務為了要維護資料的安全性,可能會透過儲存在SSL憑證中的私鑰在訊息傳遞的過程中進行加密,再透過公鑰來解密。
在開發過程中可能一切都很順利,但是一旦要將 WCF 服務佈屬到 IIS 上時,卻怎樣都無法取得存放在憑證中的私鑰,一直拿到 "Keyset does not exist" 的錯誤訊息。
這邊就跟大家分享我遇到的案例與解法。

 

有些服務為了要維護資料的安全性,可能會透過儲存在SSL憑證中的私鑰在訊息傳遞的過程中進行加密,再透過公鑰來解密。

在開發過程中可能一切都很順利,但是一旦要將 WCF 服務佈屬到 IIS 上時,卻怎樣都無法取得存放在憑證中的私鑰,一直拿到 "Keyset does not exist" 的錯誤訊息。

這邊就跟大家分享我遇到的案例與解法。

 

今天我們要「斷開」的,就是這個錯誤訊息:

image

 

其實這也不是什麼難解決的問題,依照我個人遇到的情況,只是因為 IIS 並未得到授權去存取憑證的內容,只需要針對該WCF服務在 Application Pool 中所使用的帳號加入憑證的存取權就可以輕鬆的解決了。

步驟如下:

1. 檢查在 IIS 中用來 Host 該 WCF 服務的 Application Pool 所使用的 Identity 是否為 NetworkService

    image

    萬一該 Application Pool 的 Identity 不是 NetworkService 帳號的話,可以在該 Application Pool 上按下滑鼠右鍵,再點選Advanced Settings... 進行修改。

    image image

 

2. 在開始功能表的搜尋文字方塊中輸入 mmc 後按下 enter 鍵以開啟 Microsoft Management Colsole。 在 Microsoft Management Colsole 的 File 下拉選單中選取「Add/Remove Snap-in...」。

    image image

 

3. 在出現的對話視窗中左邊的 Available snap-ins 列表中點選 Certificates ,再按下中間的 Add 按鈕後按下 OK 鈕。

    image

 

4. 在接著出現的對話視窗中選取 Computer account 之後按下 Next 按鈕。 接下來會跳出 Select Computer 對話視窗,這時候請選取 Local computer,並按下 Finish 鈕。

    image image

 

5. 確認 Selected snap-ins 列表中出現了剛才加入的 Certifications (Local Computer) 項目後按下 OK 鈕以關閉 Add or Remove Snap-ins 對話視窗。

    image

 

6. 點選 Personal 下的 Certifications 項目,並在右邊的列表中找到 WCF 服務需要使用的憑證,如果該憑證沒有出現在這邊的話,請先進行匯入憑證檔的動作。之後在憑證上按下滑鼠右鍵,點選 All Tasks –> Manage Private Keys...

    image

 

7. 在接著出現的 Permissions for XXXXX private keys 對話視窗中按下 Add... 按鈕。接著在 Select Users, Computers, or Groups 對話視窗中的文字方塊裡輸入 network service 後按下 OK 鈕。

    image image

 

8. 確認 NETWORK SERVICE 帳號至少具備 Read 的權限後按下 OK 鈕。

    image

 

9. 大功告成!!~ 回到 IIS 重啟用來 Host WCF 服務的 Application Pool 後重新試看看需要讀取私鑰的相關功能看看吧!!~