使用相同的HTTPS客户端证书并发会话时,在IIS上出现413错误

5
我有以下问题。
我在IIS 8上托管了一个WCF应用程序,该应用程序仅接受带有客户端证书的HTTPS请求。此服务接受POST消息,其大小可能会有所变化(从几个字节到1 GB),并且大多数情况下是并行接收的。
在以下情况下,客户端会收到413请求实体过大响应:
当使用相同客户端证书打开多个连接并上传许多小文件时。在这种情况下,一个请求成功,而所有其他请求都会失败,并显示413错误。
可以通过在配置的system.webServer/serverRuntime部分中将uploadReadAheadSize值设置为大于所有并行调用大小之和的较大值来解决问题,但这会导致服务器为每个调用分配整个读取前缓冲区的内存量,从而在许多并发调用的情况下导致服务器耗尽内存。
如果使用不同的客户端证书进行调用或上传一个大文件,则我的配置有效
我读到在IIS 6中有一个选项可以在配置中设置SSLAlwaysNegoClientCert来修复类似的错误。我尝试过workarounds设置此值,但在使用IIS 8.0时没有成功。我还尝试关闭SSL客户端缓存以禁用SSL会话恢复,但也没有解决我的问题。
什么可能导致413错误?有没有办法在不使用服务器的整个内存的情况下启用具有客户端证书的多个并行上传到同一服务器的功能。

1
你尝试过内部分割消息以缩小大小的方法吗? - Travis G
1
这是一个带有REST API的流式上传服务。但是,如果使用相同的客户端证书从多个位置上传,则会发生相同的情况。 - hpityu
1
你能否包含你的服务契约?我假设你要么没有使用流,要么正在使用“TransferMode = Buffered”。 - Aron
1个回答

1

仅供参考:

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

(来源于文章客户端无法重新协商请求并返回HTTP 413错误(IIS 6.0)。)

当SSLAlwaysNegoClientCert未设置时,将发生客户端重新协商,因此使用OpenSSL检查其是否启用(请参见此问题)。我没有使用过IIS 8,但在IIS 7.5上,从您链接的问题中启用SSLAlwaysNegoClientCert的两种方法对我都有效。


它是否与IIS 7或8相关? - mtkachenko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接