我目前正在开发一个具有以下组件(所有.NET 2.0)的项目
总之,客户端应用程序创建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.
相当自我解释,但我不知道是什么导致了这个问题。
其他相关信息:
如果我尝试访问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>
devserver.xyz.com
,因此我更改了我的hosts文件以指向localhost。因此,我现在可以浏览(在IIS中关闭客户端证书)到我的服务描述符页面,而不会看到任何SSL证书警告。答案 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格式的客户端证书。