1

我创建了一个具有基本 http 身份验证的自托管 WCF RESTful 服务,该服务通过带有自签名 SSL 证书的 https 运行。一切正常。当用户通过网络浏览器访问服务操作时,他们会弹出一个询问凭据(登录名/密码)的窗口。

现在我想做证书认证而不是基本认证,但它不起作用。客户端的浏览器(IE/chrome/firefox)从不提示选择证书,我总是收到 HTTP 403 错误,并且当我在自定义证书验证器中设置断点时,它永远不会命中。所以我肯定在这里遗漏了一些东西。我尝试使用 Fiddler 进行调试,它确认请求中没有身份验证标头。

这是我托管服务的代码。

Uri baseAdress = new Uri("https://localhost:8446/"); 
WebServiceHost host = new WebServiceHost(typeof(RestService));
WebHttpBinding wb = new WebHttpBinding();
wb.Security.Mode = WebHttpSecurityMode.Transport;
wb.Security.Transport.ClientCredentialType = HttpClientCredentialType.Certificate;
host.AddServiceEndpoint(typeof(IRestService), wb, baseAdress);
host.Credentials.ClientCertificate.Authentication.CertificateValidationMode = 
X509CertificateValidationMode.Custom;
host.Credentials.ClientCertificate.Authentication.CustomCertificateValidator = 
new MyX509CertificateValidator()
host.Open();

感谢您的任何提示。

4

2 回答 2

1

我发现这篇文章可能会对您有所帮助:http: //blogs.msdn.com/b/james_osbornes_blog/archive/2010/12/10/selfhosting-a-wcf-service-over-https.aspx

它谈到了某种将证书注册到 netsh,..

另外,请确保您的证书颁发给本地主机(因为您调用的 url 中的域部分应该与证书相同。颁发给)。

于 2013-04-14T16:33:30.273 回答
1

感谢您的输入。我发现出了什么问题。

当我使用 makecert 工具为 ssl 端口绑定创建自签名证书时,我添加了“-eku”密钥,该密钥使证书用于服务器身份验证。我在没有该选项的情况下重新创建了另一个,因此它可以用于所有目的。

我还确保我的证书在当前用户的个人存储中。之后,当客户输入我的服务的 url 时,他们会弹出一个窗口,要求他们选择一个证书,这是我创建的一个。

对于那些面临同样问题的人,这篇文章可能很有用。

于 2013-04-15T12:23:47.560 回答