[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 后重新试看看需要读取私钥的相关功能看看吧!!~