使用相同的HTTPS客户端证书在并发会话上获取413错误

时间:2013-03-08 17:41:20

标签: wcf iis ssl iis-8

我有以下问题。

我在IIS 8上托管WCF应用程序,该应用程序接受带有客户端证书的 HTTPS请求。此服务接受POST消息,其大小可能不同(从几个字节到1 GB),并且大部分时间都是并行接收的。

在以下情况下,客户端获得413请求实体的响应太大:

  • 使用相同客户端证书打开多个连接时,会上传许多小文件。在这种情况下,一个请求成功,所有其他请求失败,出现413错误。

问题可以通过将uploadReadAheadSize值设置为大于配置的system.webServer/serverRuntime部分中所有并行调用大小的总和来解决,但这会导致服务器分配每个调用的预读缓冲区的全部内存量,导致服务器在多个并发调用的情况下耗尽内存。

如果使用不同的客户端证书进行调用或上传一个大文件,我的配置可以

我已经读过,在IIS 6中,有一个选项可以在配置中设置SSLAlwaysNegoClientCert来修复类似的错误。我已尝试workarounds设置此值,但未使用IIS 8.0成功。我也尝试关闭SSL客户端缓存以禁用SSL会话恢复,但这也没有解决我的问题。

可能导致413错误的原因是什么?有没有办法在不使用服务器的整个内存的情况下,使用客户端证书启用多个并行上载到同一服务器。

1 个答案:

答案 0 :(得分:1)

只是一个猜测:

  

如果请求客户端重新协商,则必须使用SSL预加载预加载请求实体主体。 SSL预加载将使用UploadReadAheadSize配置数据库属性的值,该属性用于ISAPI扩展。 但是,如果UploadReadAheadSize小于内容长度,则返回HTTP 413错误,并关闭连接以防止死锁。(由于客户端正在等待完成发送请求实体,因此发生死锁,而服务器正在等待重新协商完成,但重新协商要求客户端能够发送数据,这是不能做的。)

(来自文章Client cannot renegotiate request and returns an HTTP 413 error (IIS 6.0)。)

当未设置SSLAlwaysNegoClientCert时,会发生客户端重新协商,因此请使用OpenSSL检查它是否已启用(请参阅this question)。我没有使用IIS 8,但在IIS 7.5上,从the question you linked启用SSLAlwaysNegoClientCert的两种方式都适用于我。