创建需要客户端证书的Web服务

时间:2010-12-08 17:17:49

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

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

  1. 客户申请
  2. Web服务调用API
  3. 网络服务
  4. 总之,客户端应用程序创建API的实例,并调用Web服务。很好,很简单,这一切都完全符合我的要求。

    该项目的下一个阶段是使用SSL保护Web服务。所以我创建了一个“自签名CA”并从此签署了IIS的服务器证书。再次,简单,这一切都完全按照我的意愿运作。

    该项目的下一阶段是通过要求调用者提供客户端证书来保护Web服务。所以我创建了一个客户端证书(通过自签名CA)。然后我将其添加到API中的Web Service调用调用:

    WSBridge.Processor processor = new WSBridge.Processor();
    processor.Url = this.endpoint;
    processor.ClientCertificates.AddRange(this.clientCertificates);
    processor.Timeout = (int)Settings.Default["DefaultTimeout"];
    

    在调试中,我可以看到this.clientCertificates包含我创建的证书。因此理论上它正在呈现给Web服务器。

    但是,当我尝试调用Web服务时,我在API中遇到以下异常:

    The request failed with HTTP status 403: Forbidden.
    

    相当自我解释,但我不知道是什么导致了这个问题。

    其他相关信息:

    • 在我的开发环境中,客户端,API& Web服务都在同一台机器上运行
    • 如果我尝试访问IIS中的Web服务描述,则会收到以下错误(系统不会提示我选择客户端证书):

      HTTP错误403.7 - 禁止访问 您尝试访问的页面要求您的浏览器具有Web服务器可识别的安全套接字层(SSL)客户端证书。

    • 客户端证书已加载到当前用户的个人存储中,CA根位于本地计算机和当前用户的受信任根目录中。

    • 如果我关闭“需要SSL”并在IIS中接受“客户端证书”,我可以提出我的请求。但是,当我在Web服务中查看HttpContext.Current.Request.ClientCertificate.Count时,它返回为0。

    • 我需要能够使用客户端证书运行我的开发,因为服务代码的一部分使用客户端证书的CN来执行各种操作。我可以破解它但是能够真正地结束这一点会很好。

    • 此处提及的所有证书均使用OpenSSL生成。我正在开发Windows 7,因此我无法安装Microsoft CA

    那么,有没有人对这个问题的原因有任何想法?

    顺便说一句(不值得为此创建一个新问题) - 出于某种原因,当我为Web服务启用SSL时,Visual Studio不再能够调试该服务。

    编辑:更多信息

    • 客户端证书的目的是<All>
    • 虽然我正在使用localhost,但是Web服务器的服务器证书已颁发给devserver.xyz.com,因此我更改了我的hosts文件以指向localhost。因此,我现在可以浏览(在IIS中关闭客户端证书)到我的服务描述符页面,而不会看到任何SSL证书警告。

1 个答案:

答案 0 :(得分:3)

我有解决问题,总结这是由于客户端证书的格式应该是PKCS12。

更多详情

虽然MMC证书插件在当前用户的个人存储中显示客户端证书,但我注意到当通过Internet Explorer查看同一商店时(工具 - &gt; Internet选项 - &gt;内容 - &gt;证书)证书不存在。

经过一点点Google搜索后,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格式的客户端证书。