2013-05-03 2 views
9

Я пытаюсь настроить Mercurial на IIS 7.5. У меня есть web.config для каталога приложений, который игнорирует атрибут maxAllowedContentLength, и я просто не может получить IIS, чтобы принять его! Я пробовал это тысячу разных способов на глобальном, местном и каждом уровне. Он придерживается своего значения по умолчанию 30 МБ и отказывается позволить мне вводить изменения, которые больше, чем это. Он даже не закрывает соединение, он просто доходит до 30 МБ и полностью закрывается. Это не проблема с тайм-аутом, я попытался перейти от локальной машины к ее IP-адресу.IIS 7.5 Mercurial setup игнорирует maxAllowedContentLength

Что, черт возьми, происходит?

<?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> 

ответ

9

Я нашел несколько способов решения этой проблемы:

Чтобы исправить это на стороне сервера в IIS, загрузите и установите https://www.nartac.com/Products/IISCrypto/Default.aspx и нажмите кнопку BEAST, или сила SSL3.0 путем отключения другие протоколы.

Если у вас нет доступа к серверу IIS, вы можете исправить его, отбросив Python до версии 2.7.2 или ранее.

Если вы предприимчивы, вы можете изменить ртутный источник в sslutil.py, в верхней части, измените строку

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.

Если вас интересует, почему Python 2.7.3 сломал это, посмотрите на http://bugs.python.org/issue13885 для объяснения (это связано с безопасностью). Если вы хотите изменить сам Python, в модулях/_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); 

Compile и переустановить питона и т.д. Это добавляет больше совместимости SSL за счет потенциальных рисков безопасности, если я правильно понимаю документы OpenSSL.

+1

Это полное исправление, не требующее изменений на стороне клиента. Отлично! – jocull

+0

Огромное спасибо за публикацию этого! Я застрял в проблемах с большими файлами в течение нескольких дней, и это, наконец, исправило это! –

+1

Даже после установки программного обеспечения выше и принудительного SSL 3.0, я все еще не могу выдвигать изменения, размер которых превышает 30 МБ на IIS, размещенном в Mercurial. Может кто-нибудь помочь? – Sahil

0

У меня такая же установка работает, и мне нужно, чтобы добавить атрибут maxAllowedContentLength сегодня.
Я только что вставил его внизу моего существующего web.config, и он работал сразу без проблем (с фиксацией> 100 МБ).

Мой полный 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> 
+0

Это тот самый атрибут, который я установил выше, но он все еще не работает. Пробовали ли вы продвигать большие транзакции по HTTPS? Мина в порядке с HTTP. – jocull

+1

Нет, я не пробовал HTTPS. Мы используем только HTTP (это внутренний сервер). –

+0

Было бы очень полезно для меня, если бы вы автоматически подписали сертификат и попробовали его через HTTPS. Я хочу знать, сумасшедший ли я, или если это истинный баг IIS, который я считаю. Самоподписывание занимает всего несколько секунд: http://weblogs.asp.net/scottgu/archive/2007/04/06/tip-trick-enabling-ssl-on-iis7-using-self-signed-certificates.aspx – jocull

2

В моем случае мне пришлось внести дополнительные изменения в программное обеспечение IISCrypto, упомянутое выше.

У меня есть IIS 7.5 и IISCrypto версии 1.4 (последняя на момент написания)

Переход на «Лучший» или «PCI» профиль не работает для меня, поэтому я сделал следующее.

  • Изменен: профиль изменен на лучший вариант.
  • Ищите левый нижний поле с именем SSL Cipher Suite Order.
  • Отключить/снимите все CBC на основе шифры
  • Перезагрузите компьютер/сервер

Я нашел решение от this thread и ответ от Zach Mason работал для меня, как описано выше.

Надеюсь, это поможет кому-то.

+0

Действительно, это устраняет проблему, когда просто отключить что-либо ниже SSLv3 нет. Тем не менее, я не уверен, что мне удобно отключать каждый шифр на основе CBC, учитывая, что в моем случае на одном и том же сервере работают другие сайты TLS/SSL. Все еще не нашли подходящего решения для этого. – JimmiTh

3

Как и другие, принятый ответ не сработал для меня.

Причина неудачи загрузки, как представляется, связана с несовместимостью в наборе шифрования, который согласован между Mercurial и IIS, в частности, с настройками по умолчанию IIS, выбором набора шифров на основе CBC.

Mercurial version 2.9.1 (тот, который я протестировал) отправляет этот заказ шифра для сервера. Люксы, поддерживаемые Windows Server 2008 R2 (и IIS 7.5) с сертификатом RSA смелы здесь:

  • 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 (хотя это все еще хорошая идея), а потому, что он переехал RC4 над шифрами CBC, из-за атаку BEAST. В 1.4 RC4 снова был сбит, из-за недавно обнаруженных уязвимостей.

Итак ... Лучшим компромиссом является перемещение приоритета IIS для RC4_128_SHA выше AES_256_SHA. Обратите внимание, что преимущества AES 256 по сравнению с AES 128 в плане безопасности широко обсуждаются.

По сути, это по-прежнему приоритет всех шифров ECDHE CBC, которые Mercurial не поддерживает в настоящий момент, но все современные браузеры делают. IE, работающий на Windows XP, а также Android 2.3 будет использовать RC4 из-за этого изменения - остальные будут покрыты. Пока RC4 сломан, атака на него не является тривиальной. Для моих целей, я думаю Я выживу. Любой пользователь этого метода должен будет самостоятельно подумать, не рискуют ли они этим. :-)

Это еще компромисс, и я вовсе не рад этому, но, по крайней мере, я нашел (рабочий и ) компромисс работоспособного. Теперь, если только был способ выбрать порядок шифрования для каждого веб-сайта, а не глобально на сервере ...

Спасибо @Sahil за то, что указали мне в этом направлении.

+0

Итак, чтобы не идти на компромисс, что нужно «исправлять»? Mercurial? IIS? Python? Где я должен регистрировать ошибку, если ее еще нет? –

3

Как объяснено в this rant, IIS 7.5 вводит настройки по умолчанию для maxAllowedContentLength в Machine.config, который, по-видимому взять верх над любой заданный в любой Web.config.

Чтобы устранить это, откройте диспетчер IIS, щелкните узел сервера, выберите Редактор конфигурации и разверните system.webServer/security/requestFiltering, а затем измените значение requestLimits/maxAllowedContentLength (что по умолчанию имеет значение 30000000 байт). Не забудьте нажать «Применить» после этого.

Смежные вопросы