没有身份验证的 WCF 传输安全性

Posted

技术标签:

【中文标题】没有身份验证的 WCF 传输安全性【英文标题】:WCF transport security with no authentication 【发布时间】:2010-09-16 10:04:45 【问题描述】:

是否可以在不进行身份验证的情况下获得传输安全性?我很清楚它的缺陷,但 atm 我无法在客户端安装证书。 看来我可以将 WSHttpBinding.SecurityMode 设置为 Transport 并将 ClientCredentialType 设置为 HttpClientCredentialType.None,但是当我尝试调用该服务时,我得到了这个异常:

向https://[MyService] 发出 HTTP 请求时出错。这可能是由于在 HTTPS 情况下未使用 HTTP.SYS 正确配置服务器证书。这也可能是由于客户端和服务器之间的安全绑定不匹配造成的。

我不认为这是客户端和服务器之间的安全绑定不匹配,因为我使用的是 svcutil 生成的代理。

如果我将 ClientCredentialType 设置为 None,它为什么还要寻找服务器证书?

【问题讨论】:

除了我在下面的回答之外,如果您希望依靠 ISA 服务器之类的东西来执行您的 HTTPS 加密,而不是托管您的 Web 服务的 IIS 服务器,那么还有其他障碍。如果这是您的要求,最好提出一个新问题。 【参考方案1】:

您可以在没有身份验证的情况下进行 HTTPS 通信,但您不能在没有证书的情况下进行 HTTPS 通信,因为 HTTPS 加密使用证书。

有几点需要检查:

    您能否在浏览器中通过 HTTPS 访问网站上的 WSDL 或其他资源? 在执行此操作时是否收到任何有关证书的警告?

如果您无法通过 HTTPS 访问站点上的 WSDL 或其他资源,则说明服务器上未配置 HTTPS。

如果您收到有关证书的警告,则说明您没有客户端信任的证书。这里有三个选项;一个是从像Verisign 这样的地方获得一个受信任的有效证书,另一个是将证书安装在用户存储的受信任部分(你不能像你提到的那样做),最后是在客户端的 WCF 配置中关闭证书吊销。

【讨论】:

如何在客户端的 WCF 配置中关闭证书吊销? 将吊销模式设置为无。【参考方案2】:

您设置的内容看起来与您想要的相符。

我认为问题与确保传输级安全 (HTTPS) 所需的证书与身份验证所需的任何证书之间的差异有关。

要执行传输级别的安全性,您需要为 IIS 服务器配置一个证书以用于其加密。这绝不用于识别 WCF 通信中的各方,只是为了保护通信。 (用于此 HTTPS 传输的证书也用于标识服务器,但与 WCF 身份无关)

这里是blog post 的链接,解释了如何为此目的在 IIS 中设置证书。不一定是最好的谷歌,只是我发现的第一个涵盖了所有重要点。 MSDN 也应该详细介绍这一点。

【讨论】:

服务器证书用于向客户端标识服务器。如果证书上的公用名与客户端连接的 URL 不匹配,则默认操作是中止连接。 @JeremyWiebe Cheers - 我指的是 WCF 通信中的各方。我会澄清的。【参考方案3】:

即使安全模式设置为传输且客户端凭据类型设置为无,我也遇到了您描述的错误。

这是因为我的 Web 服务 URL 已由 Visual Studio 2010 服务引用创建者创建为 http://www.myservice.com:80/myservice.asmx 并具有特定端口 80。当我将其更改为 http://www.myservice.com/myservice.asmx 绑定工作正常。

【讨论】:

以上是关于没有身份验证的 WCF 传输安全性的主要内容,如果未能解决你的问题,请参考以下文章

带有身份验证的 WCF 流式处理

IIS 托管具有 SSL 安全性的 WCF -“HTTP 请求被客户端身份验证方案‘匿名’禁止”错误

ASP.NET MVC 和 WCF 服务安全 - 身份验证、路由

WCF 身份验证 - 验证消息的安全性时出错

WCF 身份验证错误

WCF - Windows 身份验证 - 安全设置需要匿名