WCF错误“这可能是因为在HTTPS情况下使用HTTP.SYS未正确配置服务器证书”

时间:2010-01-06 15:16:09

标签: xml wcf web-services wcf-security

我在使用从Windows服务到我的Web服务器上运行的WCF服务的WCF调用时遇到问题。这个电话已经工作了好几个星期,但后来突然停止工作,从那以后一直没用。

我得到的例外是:

  

发生一般错误System.ServiceModel.CommunicationException:发出HTTP请求时发生错误

然后它说

  

这可能是由于在HTTPS情况下未使用HTTP.SYS正确配置服务器证书。这也可能是由于客户端和服务器之间的安全绑定不匹配造成的。

我在两端使用的安全性是wsHttpBinding,没有任何加密。它也只是使用HTTP - 而不是HTTPS,所以我不确定它为什么抱怨HTTPS。

内部异常堆栈的其余部分是:

  

SystemNet.WebException:底层连接已关闭:发送时发生意外错误。   ---> System.IO.IOException:无法将数据写入传输连接:提供了无效参数。   ---> System.Net.Sockets.SocketException:System.Net.Sockets.NetworkStream.MultipleWrite(BufferOffsetSize [] buffers)中System.Net.Sockets.Socket.MultipleSend(BufferOffsetSize [] buffers,SocketFlags socketFlags)提供了无效参数

我还应该注意到,我的程序中发生这种情况的点是在Web服务调用的“执行”行 - 也就是说,只要我调用Web服务并将其传递给包装的DataContract对象,它爆炸了。

所有这些服务正在传递大量的XML(作为.NET对象传递给客户端的调用),然后它会进行一些工作。可能正在传输大约100-200k的XML。我已经将两端数据大小的限制提高到超过6兆,但这似乎没有帮助。

有什么想法吗?


有关此问题的更多信息:

当我们在本地复制客户端环境时,我们发现除非进行以下更改,否则我们无法上传大量XML: 1.在服务器上,将“maxRequestLength”设置为100 MB(比我们发送的方式更高) 2.在客户端,我们将dataContractSerializer标记下的maxItemsInObjectGraph值设置为“2147483646”。

通过这些更改,我们的本地安装成功上传。但是,客户端在其服务器上的安装仍然失败。有趣的是,一旦我们在服务器上更改了maxRequestLength值,我们的测试安装就会开始抛出一个与maxItemsInObjectGraph设置有关的错误。而在我们客户端的服务器上,仍然发生了原始的“HTTP.sys”错误。

正如我之前提到的,我们根本没有使用SSL,还有2个其他Web服务调用以相同的方式执行和上传XML。但是,由于非工作服务呼叫会传输更多数据,因此这似乎是一个规模问题。

但是,如果客户端遇到的问题与我们的测试安装相同,我不明白为什么客户端错误消息与ObjectGraph错误无关。

我们是否可能只是为客户端上的每个可能的错误获取通用的“无效参数”“HTTP.sys”错误(即,它确实得到了objectGraph错误,但只是没有显示它? )

21 个答案:

答案 0 :(得分:52)

我们遇到此问题,因为主机服务器已更新为使用TLS V1.2,我们使用标准SSL进行连接。这是作为网站笔测试的一部分进行的更新。我们在代码连接中看到了这个问题,但是没有浏览器转到wsdl。 代码已解决:

if (System.Net.ServicePointManager.SecurityProtocol == (SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls))
    System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;

从这里采取:How do I disable SSL fallback and use only TLS for outbound connections in .NET? (Poodle mitigation)

答案 1 :(得分:19)

我在IIS 7上运行的服务上遇到了同样的问题 该服务连接到多个供应商服务器(有些SSL没有) 当添加新的这些(这个新的供应商是TLS 1.2)时,我会在对原始服务器(SSL)提出一些请求后得到错误。

要确认这一点,我只需在每个请求发送给每个供应商之前记录System.Net.ServicePointManager.SecurityProtocol

低并且在重新启动服务(或重新启动应用程序池)后看到我会得到输出Ssl3, Tls但是在对原始供应商服务器的一些请求之后,这变为Ssl3并向TLS请求服务给出了错误。

要修复我只是做了user369142建议的内容。 在每次请求新服务器之前:

System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12 | SecurityProtocolType.Ssl3;

并且没有更多错误。

答案 2 :(得分:9)

这个问题是真正的HTTPS绑定和“这可能是由于在HTTPS情况下没有使用HTTP.SYS正确配置服务器证书的事实......”。 在对代码和配置中的所有内容进行双重检查之后,似乎错误消息不像内部异常那样具有误导性,因此在快速检查之后我们发现端口443被skype(在开发服务器上)挂钩。我建议你看一下阻止请求的内容(Fiddler可以在这里提供帮助),并确保你可以到达服务前端(查看浏览器中的.svc)及其元数据。

祝你好运。

答案 3 :(得分:6)

在我的情况下,我必须为.Net启用SchUseStrongCrypto 这会强制服务器使用TLS 1.0,1.1或1.2建立连接。如果未启用SchUseStrongCrypto,则连接尝试使用已在我的远程端点禁用的SSL 3.0。

用于启用强加密的注册表项:

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NetFramework\v4.0.30319]
"SchUseStrongCrypto"=dword:00000001

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319]
"SchUseStrongCrypto"=dword:00000001

答案 4 :(得分:5)

对于我们来说,此错误是因为运行该服务的开发人员计算机已将IIS配置为仅在127.0.0.1上绑定端口443。

在IIS管理器中,右键单击该网站,然后选择“编辑绑定”。如果端口443的条目具有IP地址127.0.0.1,请将其更改为*

答案 5 :(得分:4)

将您的客户端应用程序更改为4.5及更高版本。 如果您是4.5,则根据需要使用:System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12 / Tls1.1 / Tls1.0,也可以将应用程序升级到4.6.1以上。

答案 6 :(得分:4)

我们最近发生了几乎完全相同的问题,结果是由于在主叫计算机上安装了Microsoft更新KB980436(http://support.microsoft.com/KB/980436)。除了直接卸载它之外,我们的修复是按照KB站点上的说明将注册表中的UseScsvForTls DWORD设置为1.如果您在调用系统中看到此更新已安装,您可能需要尝试一下

答案 7 :(得分:4)

经过大量的搜索并且徒劳得到了主的名字后我终于得到了它。我已经在运行我的wcf服务的服务器上安装了TLS 1.2。我的客户端配置正确但它是在.NET 4.5上构建的。 1而wcf是在.NET 4.6.1上。如果使用TLS 1.2,则客户端和服务器必须位于同一.NET版本中。我希望有一天能帮到某人: - )

答案 8 :(得分:3)

在亚马逊AWS上针对IIS和glassfish运行旧版XP SP3时遇到此问题。亚马逊将其默认负载均衡器设置更改为不启用DES-CBC3-SHA密码。你必须在亚马逊ELB上启用它,如果你想允许旧版XP TLS 1.0对抗ELB for HTTPS,否则你会收到此错误。可以通过转到控制台中的监听器选项卡并单击要尝试工作的特定监听器旁边的密码来更改ELB上的密码。

答案 9 :(得分:2)

如果您的WCF服务正在使用.net framework 4.0且有人在服务器上禁用了TLS 1.0,那么您将看到此异常。由于.net 4.0不支持更高版本的TLS。

支持的协议:https://msdn.microsoft.com/en-us/library/system.security.authentication.sslprotocols(v=vs.100).aspx

答案 10 :(得分:1)

尝试在浏览器和Https模式下浏览服务,如果它不是眉毛,那么它就证明了这个错误的原因。现在,要解决此错误,您需要检查:

  • https port,检查其他资源(网站)是否正在使用
  • 检查https的证书是否配置正确(检查签名机构,自签名证书,使用多个证书)
  • 检查Https模式的WCF服务绑定和配置

答案 11 :(得分:1)

我已经看到了与复杂数据类型问题相关的这些特殊异常,如果您传递集合或枚举,请参阅以下帖子:

Complex Data Types

答案 12 :(得分:1)

我们的问题只是端点上的端口号错误地设置为8080。将其更改为8443即可正常工作。

答案 13 :(得分:1)

由于一切工作正常几周然后停止了,我怀疑这与你的代码有什么关系。当IIS / ASP.NET中的服务激活时,可能会发生错误,而不是在调用代码时。运行时可能只是检查网站的配置并抛出与服务无关的一般错误消息。

我怀疑证书已过期或绑定设置不正确。如果网站配置错误的HTTPS,无论您的代码是否使用它们,您可能会收到此错误。

答案 14 :(得分:1)

如果您使用的是传输模式=流式传输,请尝试将其更改为缓冲。

如果这不是问题,您可以发布您的配置。

答案 15 :(得分:0)

除了明确设置安全协议之外,更好的方法是设置web.config 或更高版本。

答案 16 :(得分:0)

我通过将.NetFramework版本从4.5.2升级到4.7.2解决了问题。

答案 17 :(得分:0)

我们遇到了同样的问题,在我们的案例中,它通过重新安装证书并再次创建绑定得以解决。 引导我们的是,即使在网站上获得一个简单的png图像文件也会产生同样的错误。

答案 18 :(得分:0)

刚刚见过这个:

System.ServiceModel.CommunicationException:

http://example.com/WebServices/SomeService.svc发出HTTP请求时发生错误。这可能是由于在HTTPS情况下未使用HTTP.SYS正确配置服务器证书。这也可能是由客户端和服务器之间的安全绑定不匹配引起的。

---> System.Net.WebException:基础连接已关闭:发送时发生意外错误。

---> System.IO.IOException:无法将数据写入传输连接:远程主机强制关闭现有连接。

我们的蓝色代理许可证已过期!因此无法联系到外部人员(互联网)。

答案 19 :(得分:0)

我们的应用程序最近通过网络设备(F5)操作系统更新强制关闭SSL到TLS。我们通过重新生成自签名证书来修复此错误。希望这有助于将来解决问题,因为我们在到达解决方案之前花了多个维护窗口进行故障排除。

答案 20 :(得分:0)

刚刚见过这个:

  

System.ServiceModel.CommunicationException:

     

发生错误   向http://example.com/WebServices/SomeService.svc发出HTTP请求。这可能是应该的   未正确配置服务器证书的事实   在HTTPS情况下使用HTTP.SYS。这也可能是由a引起的   客户端和服务器之间的安全绑定不匹配。

     

---> System.Net.WebException:基础连接已关闭:发送时发生意外错误。

     

---> System.IO.IOException:无法将数据写入传输连接:远程强制关闭现有连接   主机。

我从管理员那里发现,托管Web服务的IIS应用程序池在耗尽内存后会自动回收。应用程序池回收时,客户端发生错误。

增加应用程序池可用的内存解决了当前问题。