我正在尝试在IIS 7.5上设置Mercurial。我有一个忽略maxAllowedContentLength
属性的应用程序目录的web.config,我只是不能让IIS接受它!我在全球,本地和各个层面尝试过千种不同的方式。它默认为30MB,并且拒绝让我推动大于此的变更集。它甚至没有关闭连接,它只是达到30MB并完全停止。这不是超时问题,我尝试从本地计算机推送到其IP地址。
到底是怎么回事?
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<handlers>
<add name="Python" path="*.cgi" verb="*" modules="CgiModule" scriptProcessor="C:\Python27\python.exe -u "%s"" resourceType="Unspecified" requireAccess="Script" />
</handlers>
<security>
<requestFiltering>
<requestLimits maxAllowedContentLength="1073741824" />
</requestFiltering>
</security>
<rewrite>
<rules>
<rule name="rewrite to hgwebdir" patternSyntax="Wildcard">
<match url="*" />
<conditions logicalGrouping="MatchAll" trackAllCaptures="false">
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
</conditions>
<action type="Rewrite" url="hgweb.cgi/{R:1}" />
</rule>
</rules>
</rewrite>
</system.webServer>
<!-- I don't know if this is supposed to work... it doesn't matter where I put the settings. -->
<location path="*">
<system.web>
<!-- maxRequestLength is in kilobytes (KB) -->
<httpRuntime maxRequestLength="1048576" /> <!-- 1GB -->
</system.web>
<system.webServer>
<security>
<requestFiltering>
<!-- maxAllowedContentLength is in bytes (B) -->
<requestLimits maxAllowedContentLength="1073741824"/> <!-- 1GB -->
</requestFiltering>
</security>
</system.webServer>
</location>
</configuration>
答案 0 :(得分:9)
我找到了一些处理这个问题的方法:
要在IIS中修复此服务器端,请下载并安装https://www.nartac.com/Products/IISCrypto/Default.aspx并单击BEAST按钮,或通过禁用其他协议强制使用SSL3.0。
如果您无权访问IIS服务器,则可以通过将Python回滚到2.7.2或更早版本来修复它。
如果您喜欢冒险,可以修改sslutil.py中的mercurial源,靠近顶部,更改行
sslsocket = ssl.wrap_socket(sock, keyfile, certfile,
cert_reqs=cert_reqs, ca_certs=ca_certs)
到
from _ssl import PROTOCOL_SSLv3
sslsocket = ssl.wrap_socket(sock, keyfile, certfile,
cert_reqs=cert_reqs, ca_certs=ca_certs, ssl_version=PROTOCOL_SSLv3)
这将解决问题并修复IIS后面的mercurial推送限制。
如果您对Python 2.7.3打破此问题感兴趣,请查看http://bugs.python.org/issue13885以获取解释(与安全相关)。如果要修改Python本身,请在Modules / _ssl.c中更改行
SSL_CTX_set_options(self->ctx,
SSL_OP_ALL & ~SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS);
回到2.7.3之前的情况:
SSL_CTX_set_options(self->ctx, SSL_OP_ALL);
编译并重新安装python等。如果我正确理解OpenSSL文档,这会增加更多的SSL兼容性,代价是潜在的安全风险。
答案 1 :(得分:3)
和其他人一样,接受的答案对我没有用。
上传失败的原因似乎与Mercurial和IIS之间协商的密码套件中的不兼容性有关 - 特别是与IIS&#39;默认设置,选择基于CBC的密码套件。
Mercurial版本2.9.1(我测试过的那个)将此密码套件命令发送到服务器。 Windows Server 2008 R2(和IIS 7.5)支持的带有RSA证书的套件在此处为粗体:
其中只有两个不是CBC - 基于RC4的。 IIS会根据自己和Mercurial的优先事项挑选任何产品。
IISCrypto 1.3解决问题的原因似乎不是因为它禁用了SSL 2(虽然这仍然是一个好主意),但是因为它将RC4移到了CBC密码之上套房,由于BEAST攻击。在1.4中,由于新发现的漏洞,RC4再次向下移动。
所以...最好的妥协似乎是移动IIS&#39; RC4_128_SHA的优先级高于AES_256_SHA。请注意,就安全性而言,AES 256优于AES 128的优点受到广泛争议。
安全方面,这仍然优先考虑所有ECDHE CBC密码,Mercurial目前不支持这些密码,但所有现代浏览器都这样做。由于这一变化,在Windows XP以及Android 2.3上运行的IE将使用RC4 - 其余部分均已涵盖。当RC4 被打破时,对它的攻击并不是微不足道的。为了我的目的,我认为我会活下来。这种方法的任何用户都必须自己决定是否会冒这个风险。 : - )
它仍然是妥协,我对此并不高兴,但至少我找到了可行的(和工作)妥协。现在,如果只有一种方法可以在每个网站上选择密码套件订单而不是在服务器上全局...
感谢@Sahil指出我的方向。
答案 2 :(得分:3)
正如this rant中所述,IIS 7.5在maxAllowedContentLength
中引入了Machine.config
的默认设置,显然优先于您在Web.config
中指定的内容。
要解决此问题,请打开IIS管理器,单击服务器节点,选择配置编辑器,然后展开system.webServer/security/requestFiltering
,然后更改requestLimits/maxAllowedContentLength
(默认情况下为30000000字节)。请记住以后单击“应用”。
答案 3 :(得分:2)
这是Python 2.7.3 +的SSL模块中的不兼容性。
TortoiseHg网站上记录了Bug,但它适用于通过HTTPS推送到IIS的 所有 平台。
https://bitbucket.org/tortoisehg/thg/issue/2593/cant-push-over-30mb-to-iis-via-https
答案 4 :(得分:2)
在我的情况下,我必须在上面引用的IISCrypto软件中进行更多更改。
我有IIS 7.5和IISCrypto版本1.4(编写本文时最新)
更改为“最佳”或“PCI”配置文件对我没有用,所以我确实关注了。
我找到了this thread的解决方案,Zach Mason的回答如上所述为我工作。
希望这有助于某人。
答案 5 :(得分:0)
我正在运行相同的设置,我今天需要添加maxAllowedContentLength
属性
我只是将其插入现有web.config
的底部,并且它立即工作没有问题(提交> 100MB)。
我的完整web.config
现在看起来像这样:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<handlers>
<add name="Python" path="*.cgi" verb="*" modules="CgiModule" scriptProcessor="C:\Python26\python.exe -u "%s"" resourceType="Unspecified" />
</handlers>
<rewrite>
<rules>
<rule name="rewrite to hgwebdir" patternSyntax="Wildcard">
<match url="*" />
<conditions logicalGrouping="MatchAll" trackAllCaptures="false">
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
</conditions>
<action type="Rewrite" url="hgweb.cgi/{R:1}" />
</rule>
</rules>
</rewrite>
<security>
<requestFiltering>
<requestLimits maxAllowedContentLength="2147482624" />
</requestFiltering>
</security>
</system.webServer>
</configuration>