9

我正在尝试在 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 &quot;%s&quot;" 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>
4

6 回答 6

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 兼容性。

于 2013-05-10T15:50:02.510 回答
3

像其他人一样,接受的答案对我不起作用。

上传失败的原因似乎与 Mercurial 和 IIS 之间协商的密码套件不兼容有关 - 具体而言,使用 IIS 的默认设置,选择基于 CBC 的密码套件。

Mercurial 2.9.1 版(我测试过的那个)将此密码套件命令发送到服务器。带有 RSA 证书的 Windows Server 2008 R2(和 IIS 7.5)支持的套件在此处以粗体显示:

  • TLS_DHE_RSA_WITH_AES_256_SHA
  • TLS_DHE_DSS_WITH_AES_256_SHA
  • TLS_RSA_AES_256_SHA
  • SSL_DHE_RSA_WITH_3DES_EDE_SHA
  • SSL_DHE_DSS_WITH_3DES_EDE_SHA
  • SSL_RSA_WITH_3DES_EDE_SHA
  • TLS_DHE_RSA_WITH_AES_128_SHA
  • TLS_DHE_DSS_WITH_AES_128_SHA
  • TLS_RSA_AES_128_SHA
  • SSL_RSA_WITH_RC4_128_SHA
  • SSL_RSA_WITH_RC4_128_MD5

其中只有两个不是 CBC - 基于 RC4 的。IIS 将在其自身和 Mercurial 的优先级中选择优先级之前的任何内容。

IISCrypto 1.3 解决这个问题的原因似乎不是它禁用了 SSL 2(尽管这仍然是一个好主意),而是因为它由于 BEAST 攻击而将 RC4 移到了 CBC 密码套件之上。在 1.4 中,由于新发现的漏洞,RC4 再次下移。

所以... 最好的折衷方案似乎是将 IIS 对 RC4_128_SHA 的优先级提高到 AES_256_SHA 之上。请注意,AES 256 在安全性方面优于 AES 128 的优点存在广泛争议。

安全方面,这仍然优先考虑所有 ECDHE CBC 密码,Mercurial 目前不支持,但所有现代浏览器都支持。由于此更改,在 Windows XP 和 Android 2.3 上运行的 IE 将使用 RC4 - 其余部分已涵盖。虽然 RC4破坏,但对它的攻击并非微不足道。为了我的目的,我我会活下来。这种方法的任何用户都必须自己决定是否会冒险。:-)

这仍然是一个妥协,我对此一点也不高兴,但至少我找到了一个可行的(并且有效的)妥协。现在,如果只有一种方法可以在每个网站而不是在服务器上全局选择密码套件顺序...

感谢@Sahil 为我指明了这个方向。

于 2014-03-31T00:34:50.493 回答
3

正如本咆哮maxAllowedContentLength中所解释的,IIS 7.5 引入了in的默认设置Machine.config,这显然会优先于您在 any 中指定的任何内容Web.config

要解决此问题,请打开 IIS 管理器,单击服务器节点,选择配置编辑器,然后展开system.webServer/security/requestFiltering然后更改requestLimits/maxAllowedContentLength(默认为 30000000 字节)。记得之后点击应用。

于 2014-05-21T12:09:50.947 回答
2

这是 Python 2.7.3+ 的 SSL 模块的不兼容问题。

在 TortoiseHg 站点上记录了此处的错误,但它适用于通过 HTTPS 推送到 IIS 的所有平台。

https://bitbucket.org/tortoisehg/thg/issue/2593/cant-push-over-30mb-to-iis-via-https

于 2013-05-10T14:29:21.287 回答
2

就我而言,我必须对上面提到的 IISCrypto 软件进行更多更改。

我有 IIS 7.5 和IISCrypto 1.4 版(在撰写本文时最新)

更改为“最佳”或“PCI”配置文件对我不起作用,所以我做了以下操作。

  • 将配置文件更改回最佳选项。
  • 查找名为 SSL Cipher Suite Order 的左下角框。
  • 禁用/取消选中所有基于 CBC 的密码
  • 重新启动您的计算机/服务器

我从这个线程中找到了一个解决方案,并且Zach Mason的回答对我有用,如上所述。

希望这可以帮助某人。

于 2014-02-13T14:51:06.327 回答
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 &quot;%s&quot;" 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>
于 2013-05-08T08:17:18.453 回答