我目前正在开发一个具有以下组件(全部为 .NET 2.0)的项目
- 客户端应用程序
- Web 服务调用 API
- 网络服务
总之,客户端应用程序创建 API 实例,并调用 Web 服务。漂亮又简单,这一切都完全按照我想要的方式工作。
该项目的下一阶段是使用 SSL 保护 Web 服务。因此,我创建了一个“自签名 CA”,并由此签署了 IIS 的服务器证书。再说一遍,又好又简单,这一切都完全按照我想要的方式工作。
该项目的下一阶段是通过要求调用者提供客户端证书来保护 Web 服务。所以我创建了一个客户端证书(通过自签名 CA)。然后,我将其添加到 API 中的 Web 服务调用中:
WSBridge.Processor processor = new WSBridge.Processor();
processor.Url = this.endpoint;
processor.ClientCertificates.AddRange(this.clientCertificates);
processor.Timeout = (int)Settings.Default["DefaultTimeout"];
在调试中我可以看到 this.clientCertificates
包含我创建的证书。因此理论上它会被呈现给网络服务器。
但是,当我尝试调用 Web 服务时,我在 API 中遇到以下异常:
The request failed with HTTP status 403: Forbidden.
相当不言自明,但我不知道是什么导致了问题。
其他相关信息:
- 在我的开发环境中,客户端、API 和 Web 服务都在同一台计算机上运行
如果我尝试访问 IIS 中的 Web 服务描述,则会收到以下错误(系统不会提示我选择客户端证书):
HTTP 错误 403.7 - 禁止 您尝试访问的页面要求您的浏览器具有 Web 服务器可识别的安全套接字层 (SSL) 客户端证书。
客户端证书加载到当前用户的个人存储中,CA 根位于本地计算机和当前用户的受信任根中。
如果我关闭“需要 SSL”并在 IIS 中接受“客户端证书”,我就可以提出请求。然而,当我查看
HttpContext.Current.Request.ClientCertificate.Count
时在 Web 服务中,该值返回为 0。我需要能够使用客户端证书运行我的开发,因为服务代码的一部分使用客户端证书的 CN 来执行各种操作。我可以破解它,但能够进行真正的端到端就太好了。
此处提到的所有证书都是使用 OpenSSL 生成的。我正在 Windows 7 上进行开发,因此无法安装 Microsoft CA
那么,有人对这个问题的原因有任何想法吗?
顺便说一句(不值得为此创建一个新问题) - 由于某种原因,当我为 Web 服务启用 SSL 时,Visual Studio 不再能够调试该服务。
编辑:更多信息
- 客户端证书的预期用途为
<All>
- 虽然我在本地主机上工作,但 Web 服务器的服务器证书已颁发给
devserver.xyz.com
所以我更改了主机文件以将其指向本地主机。因此,我现在可以浏览(在 IIS 中关闭客户端证书)我的服务描述符页面,而不会看到任何 SSL 证书警告。
最佳答案
好吧,我已经解决了这个问题,总而言之,这是由于客户端证书的格式所致,它应该是 PKCS12。
更多详细信息
虽然 MMC 证书插件显示当前用户的个人存储中的客户端证书,但我注意到,通过 Internet Explorer 查看同一存储时(工具 -> Internet 选项 -> 内容 -> 证书),证书不存在.
经过一番谷歌搜索后,似乎 IE 只接受 PKCS12 格式的客户端证书,因此我使用以下 OpenSSL 命令转换证书:
openssl pkcs12 -export -in client_alpha.cer -inkey client_alpha.key -out client_alpha.p12
然后,我将 p12 文件导入 IE,这使我能够浏览到具有完整客户端/服务器认证 TLS 的 Web 服务描述页面。
完成此更改后,我通过客户端应用程序重试,现在也可以正常工作。这是因为 IIS 与 IE 一样,只接受 PKCS12 格式的客户端证书。
关于visual-studio-2010 - 创建需要客户端证书的 Web 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4390303/