visual-studio-2010 - 创建需要客户端证书的 Web 服务

标签 visual-studio-2010 web-services ssl iis-7

我目前正在开发一个具有以下组件(全部为 .NET 2.0)的项目

  1. 客户端应用程序
  2. Web 服务调用 API
  3. 网络服务

总之,客户端应用程序创建 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/

相关文章:

visual-studio - 理解T4有困难

c# - 使用 C# 中的参数运行控制台应用程序 - GUI 连接建议

php - 使用 SSL 证书验证 Web 浏览器

api - TLS sslv3 握手错误

c++ - 将 PCCERT_CONTEXT 转换为 openssl 使用 - X509 结构或 ASN1

sql-server - 创建 MVC4 成员数据库

visual-studio - System.BadImageFormatException-无法解决

php - 在php网页上显示60,000条记录的最佳方式

ios - 将照片从 iPhone 上传到 4D 服务器

java - @XmlAnyElement 不会解码为特定的 Java 类型,而是停在 JAXBElement 处