пятница, 28 сентября 2012 г.

SSL и ошибка 413 или "зависает сайт"

   Предположим, написали мы достаточно сложное веб-приложение, разместили и дали доступ пользователям по сертификатам. При тестировании все было хорошо, но с началом работы начались жалобы: я на кнопочки нажимаю а оно ничего не делает. Как так? Самое смешное, что повторить ошибку так просто не удается - все работает, приложение реагирует и т.д.

    Но если открыть приложение, подождать пару минут и только тогда начать что-то делать, то можно наткнуться именно на эту ситуацию - а именно, сайт "висит" и никак не реагирует на ваши действия. Если это проделать в Internet Explorere при включенной опции "средства разработчика" (F12), то обнаружится что запрос к серверу уходит, но в ответ приходит ошибка 413 "Размер запроса слишком велик". В чем же дело?
    А дело, как я понял, в том, что при использовании SSL происходит постоянное устаревание доверительного соединения между сервером и клиентом, из-за чего при обращении оно регулярно и достаточно часто обновляется. При этом действует ограничение на размер запроса, по умолчанию равное 48 килобайт.
    Что делать?
    Проще всего выставить нужный размер ограничения запроса. Делается это из менеджера IIS. Выбираем нужный сайт, переходим в редактор конфигураций и в разделе system.webServer/serverRuntime находим параметр uploadReadAheadSize. Выставляем нужное значение в пределах разумного. Нажимаем "применить". Все, теперь, если у нас не будет расти размер запроса, об этой проблеме можно забыть.

    Есть ещё один вариант. Я его не пробовал, потому он остается как непроверенный. 
Есть в метаданных IIS  такой параметр: SSLAlwaysNegoClientCert.Он то и определяет, будет ли сервер доверять сертификату клиента весь сеанс или будет постоянно пересматривать.По умолчанию там false - т.е. не доверять. Следующим j-скриптом (внимание, скрипт честно сперт на каком-то форуме и не проверен) можно выставить его в true. Для этого создаем файлик Enable_SSL_Renegotiate_Workaround.js со следующим содержимым:


var vdirObj=GetObject("IIS://localhost/W3svc/1"); 
// replace 1 on this line with the number of the web site you wish to configure 

WScript.Echo("Value of SSLAlwaysNegoClientCert Before: " + vdirObj.SSLAlwaysNegoClientCert); 
vdirObj.Put("SSLAlwaysNegoClientCert", true); 
vdirObj.SetInfo(); 
WScript.Echo("Value of SSLAlwaysNegoClientCert After: " + vdirObj.SSLAlwaysNegoClientCert);
 
 и запускаем его:
 
cscript.exe enable_ssl_renegotiate_workaround.js 
 
   

Похожие посты:

Комментариев нет:

Отправить комментарий