Joomla 2.5-3.5 решение проблемы с циклической переадресацией при включении SSL(https)

В связи со скорым выходом 56 версии Chrome, которая будет показывать уведомление ‘Not Secure’ при посещении сайтов без SSL, я постепенно перевожу все свои сайты на использование HTTPS. Сайты на Joomla конечно же тоже есть в этом списке. Поскольку у меня сайты работают не на одном сервере, не на одном apache, а на целой связке серверов, то возникают некоторые сложности с настройкой HTTPS подключения и корректной работой некоторых скриптов. В моём случае если ничего не включать в настройках Joomla и заходить на неё по https, то картинки, css, js грузились по http, что не допустимо. В интернете почти всюду встречается рецепт: Включаем принудительно SSL в настройках Joomla. Получаем циклическую переадресацию ‘too many redirects’. Редактируем /libraries/joomla/environment/uri.php (в версии 3.5 /libraries/joomla/uri/uri.php) Заменяем 1 2 3 4 5 6 7 8 if (isset($_SERVER['HTTPS']) && !empty($_SERVER['HTTPS']) && (strtolower($_SERVER['HTTPS']) != 'off')) { $https = 's://'; } else { $https = '://'; } на 1 2 3 4 5 6 7 8 if (isset($_SERVER['HTTPS']) && !empty($_SERVER['HTTPS']) && (strtolower($_SERVER['HTTPS']) != 'off')) { $https = 's://'; } else { $https = 's://'; } тем самым делая условие абсолютно бесполезным. В этом случае сайт больше не сможет работать по HTTP, не используя HTTPS. Вся эта ситуация вырисовывается от не верных настроек вэб сервера, в моём случае серверов. Бэкэнд всё так же думает что используется HTTP соединение, php соответственно тоже, ссылки строятся без учёта HTTPS. ...

23 травня 2016 · 3 хвилин · 429 слів · dimetrius

Безопасность Openfire jabber сервера и сертификат от Let's Encrypt

Пришлось настраивать openfire jabber сервер. Просили использовать сертификат от Let’s Encrypt, естественно его авто обновление и добиться максимальной оценки на xmpp.org. Описывать установку не буду. В моём случае это был CentOS 6.6, Openfire 4.0.2 был установлен из своего же пакета, оказался на разделе /opt. Java 8 используется интегрированная в пакет, находится там же. Для получения сертификата используем LetsEncrypt. 1 /root/letsencrypt/letsencrypt-auto certonly --webroot -w /opt/ssl -d example.com для того чтоб всё отработало нужно в конфиг виртуального хоста вэб сервера нужного домена добавить что-то такое: 1 Alias "/.well-known" "/opt/ssl/.well-known" Сами должны разобраться. Отключаем устаревшие шифры в файле /opt/openfire/jre/lib/security/java.security 1 2 jdk.certpath.disabledAlgorithms=MD2, RSA keySize < 1024 jdk.tls.disabledAlgorithms=SSL_DH_anon_EXPORT_WITH_DES40_CBC_SHA, SSL_DH_anon_EXPORT_WITH_RC4_40_MD5, SSL_DH_anon_WITH_3DES_EDE_CBC_SHA, SSL_DH_anon_WITH_DES_CBC_SHA, SSL_DH_anon_WITH_RC4_128_MD5, SSL_DH_DSS_EXPORT_WITH_DES40_CBC_SHA, SSL_DH_DSS_WITH_3DES_EDE_CBC_SHA, SSL_DH_DSS_WITH_DES_CBC_SHA, SSL_DH_RSA_EXPORT_WITH_DES40_CBC_SHA, SSL_DH_RSA_WITH_3DES_EDE_CBC_SHA, SSL_DH_RSA_WITH_DES_CBC_SHA, SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA, SSL_DHE_DSS_EXPORT1024_WITH_DES_CBC_SHA, SSL_DHE_DSS_EXPORT1024_WITH_RC4_56_SHA, SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA, SSL_DHE_DSS_WITH_DES_CBC_SHA, SSL_DHE_DSS_WITH_RC4_128_SHA, SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA, SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA, SSL_DHE_RSA_WITH_DES_CBC_SHA, SSL_FORTEZZA_DMS_WITH_FORTEZZA_CBC_SHA, SSL_FORTEZZA_DMS_WITH_NULL_SHA, SSL_RSA_EXPORT_WITH_DES40_CBC_SHA, SSL_RSA_EXPORT_WITH_RC2_CBC_40_MD5, SSL_RSA_EXPORT_WITH_RC4_40_MD5, SSL_RSA_EXPORT1024_WITH_DES_CBC_SHA, SSL_RSA_EXPORT1024_WITH_RC4_56_SHA, SSL_RSA_FIPS_WITH_3DES_EDE_CBC_SHA, SSL_RSA_FIPS_WITH_DES_CBC_SHA, SSL_RSA_WITH_3DES_EDE_CBC_SHA, SSL_RSA_WITH_DES_CBC_SHA, SSL_RSA_WITH_IDEA_CBC_SHA, SSL_RSA_WITH_NULL_MD5, SSL_RSA_WITH_NULL_SHA, SSL_RSA_WITH_RC4_128_MD5, SSL_RSA_WITH_RC4_128_SHA, SSL_DH_anon_EXPORT_WITH_RC4_40_MD5, SSL_DH_anon_WITH_RC4_128_MD5, SSL_DHE_DSS_EXPORT1024_WITH_RC4_56_SHA, SSL_DHE_DSS_WITH_RC4_128_SHA, TLS_DHE_PSK_WITH_RC4_128_SHA, TLS_ECDH_anon_WITH_RC4_128_SHA, TLS_ECDH_ECDSA_WITH_RC4_128_SHA, TLS_ECDH_RSA_WITH_RC4_128_SHA, TLS_ECDHE_ECDSA_WITH_RC4_128_SHA, TLS_ECDHE_PSK_WITH_RC4_128_SHA, TLS_ECDHE_RSA_WITH_RC4_128_SHA, TLS_KRB5_EXPORT_WITH_RC4_40_MD5, TLS_KRB5_EXPORT_WITH_RC4_40_SHA, TLS_KRB5_WITH_RC4_128_MD5, TLS_KRB5_WITH_RC4_128_SHA, TLS_PSK_WITH_RC4_128_SHA, SSL_RSA_EXPORT_WITH_RC4_40_MD5, SSL_RSA_EXPORT1024_WITH_RC4_56_SHA, TLS_RSA_PSK_WITH_RC4_128_SHA, SSL_RSA_WITH_RC4_128_MD5, SSL_RSA_WITH_RC4_128_SHA, TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA, SSLv3 Для активации 256 битных шифров нужно перейти на сайт java и скачать обновлённые файлы. Переходим по ссылке http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html и качаем файл jce_policy-8.zip. Распаковываем содержимое в /opt/openfire/jre/lib/security/ с заменой. Для активации 2048 DH ключа нужно в самом скрипте запуска добавить в строку запуска параметр -Djdk.tls.ephemeralDHKeySize=2048. В человеческих системах, или когда люди больше разбираются, нужно это делать по другому ...

3 травня 2016 · 3 хвилин · 475 слів · dimetrius

Преобразование xlsx документов в csv

На одном из моих сайтов контент выводится из таблиц csv. На одной странице может выводиться до двадцати таблиц, каждая из своего csv документа. Время от времени эти таблицы приходится редактировать, иногда довольно часто. Так же, желательно этим заниматься не одному, а в компании единомышленников. Хорошим решением казалось тогда использование Google таблиц. Есть возможность назначать пользователей редакторами. Так же из Google таблиц можно экспортировать прямо в csv, но… А вот это но как раз всё портило. Заключалось оно в том что экспорт подразумевает под собой формат с разделителем запятой и в кодировке UTF-8. Мне как раз надо было чтоб разделителем была точка с запятой, чтоб текст не брался в кавычки, чтоб кодировка была Win-1251. И вот нашёлся на просторах интернета замечательный инструмент для работы из консоли - xlsx2csv. Теперь мы по крону вытягиваем из Google таблиц многостраничный документ xlsx, обрабатываем его xlsx2csv, на выходе получаем каждую страницу в отдельном документе csv. Создали в удобном месте файл generate.sh, а в него прописали следующие команды: 1 2 #!/bin/bash cd /home/web/site.org.ua/ && wget -O tmp/table.xlsx https://docs.google.com/spreadsheets/d/1Fd8c6IJF4oLT1cs5QmZ1KK8/pub?output=xlsx && ./xlsx2csv.py -a -c cp1251 -d ";" -i tmp/table.xlsx tmp/ && cp -r tmp/*.csv public_html/images/tables Объясню подробнее. Сначала мы переходим в директорию из которой это всё выполняется 1 cd /home/web/site.org.ua/ потом скачиваем документ и сохраняем его с указанными нами названием и расширением ...

3 травня 2016 · 2 хвилин · 315 слів · dimetrius

Curl для просмотра локальных виртуальных хостов

Иногда, когда у нас целая цепочка вэб серверов, прокси и т.д., нужно обратиться непосредственно к последнему вэб серверу, что бы исключить все возможные ошибки на следующих. Для этого можно использовать curl с ключём -H для передачи необходимых заголовков. 1 curl -H 'Host: domain.com' http://127.0.0.1/something

13 квітня 2016 · 1 хвилина · 44 слів · dimetrius

Exim - пересылка email писем определённого домена отправителя на smarthost

На одном из серверов крутятся несколько сайтов, но почта с этих сайтов должна рассылаться с другого сервера. Пришлось искать решение вопроса. И оно нашлось… По сути работает условие, если домен отправителя равен указанному нами домену, то почта отправляется на smarthost, который в свою очередь принимает почту от первого сервера без авторизации. Настраивалось это на Ubuntu, Debian с этим чудным конфигом… На CentOS, RedHat будет немного проще. Открываем на редактирование файл /etc/exim4/exim4.conf.template Добавляем блок smart_route 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 begin routers smart_route: condition = ${extract{smart_host}{${lookup{$sender_address_domain}lsearch{/etc/exim4/staticroutes}{$value}fail}}} driver = manualroute transport = remote_smtp route_list = "* ${extract{smart_host}{${lookup{$sender_address_domain}lsearch{/etc/exim4/staticroutes}{$value}fail}}}" #smarthost: # driver = manualroute # domains = ! +local_domains # transport = remote_smtp # route_list = * smartrelay.domain.com # no_more # no_verify dnslookup: driver = dnslookup domains = !+local_domains transport = remote_smtp no_more Остальное приведено для примера, т.е. по сути добавляем блок сразу после begin routers. Вторым шагом создаём файл /etc/exim4/staticroutes с содержимым ...

13 квітня 2016 · 2 хвилин · 247 слів · dimetrius

FreeBSD: Добавить/удалить дополнительный IP алиасом

Добавляем дополнительный IP адрес сетевой карте во FreeBSD Обратите внимание на слово alias в конце команды. Если его не будет, то команда заменит текущий основной IP адрес тем, что мы хотим добавить. В этом примере сетевой адаптер имеет имя dc0 (# DEC/Intel 21143 или аналогичные). Имена могут быть разными. 1 ifconfig dc0 inet 192.168.0.100 netmask 255.255.255.255 alias Для того что бы этот алиасный IP адрес подтянулся после перезагрузки, отредактируйте и добавьте следующую строку в файл /etc/rc.conf: 1 ifconfig_dc0_alias0="inet 192.168.0.100 netmask 255.255.255.255" Маска подсети будет работать, если новый IP адрес в той же подсети, что и основной IP адрес. Только один IP адрес подсети на адаптере должен иметь реальную маску подсети, отличную от 255.255.255.255. Удаление алиасного IP адреса с сетевого адаптера во FreeBSD 1 ifconfig dc0 inet 192.168.0.100 -alias Теперь можете использовать ifconfig dc0 команду для того чтоб увидеть результат.

13 квітня 2016 · 1 хвилина · 139 слів · dimetrius

GeoIP + iptables + fail2ban на Fedora 16, или RFRemix 16

При покупке нового VPS сервера поставил перед собой задачи большей защищённости SSH. Конечно можно перенести SSH на другой порт, в следствии чего количество попыток взлома очень сильно падает, но это не мой вариант. Что будем делать: установим базу GeoIP, привяжем её к iptables, разрешим доступ к SSH только из нужной нам страны (UA), даже для Украины повесим fail2ban, для желающих попробовать свои возможности во взломах SSH с Украины. Зачем эти сложности, ведь можно только моему IP разрешить доступ? Всё дело в том что замечена следующая ситуация, как только уезжаешь из дома к кому-то в гости, сразу же происходит что-то не адекватное с сервером, нужно зайти по SSH и всё исправить. Но если мы разрешим доступ только для домашнего IP, то с гостей уже не зайдём. Было решено разрешить доступ только украинским IP адресам, чтоб не волноваться. Приступим же… 1 yum install xtables-addons perl-Text-CSV_XS Этим мы установили модуль для iptables. Теперь проверим подгрузился ли он… 1 iptables -m geoip --help Внизу текста должны увидеть: 1 2 3 4 5 6 7 geoip match options: [!] --src-cc, --source-country country[,country...] Match packet coming from (one of) the specified country(ies) [!] --dst-cc, --destination-country country[,country...] Match packet going to (one of) the specified country(ies) NOTE: The country is inputed by its ISO3166 code. Этого нам и надо было добиться. Создадим папку mkdir -p /usr/share/xt_geoip/ ...

13 квітня 2016 · 2 хвилин · 332 слів · dimetrius

libzip отсутствует в PHP 5.3.10 в комплекте с Fedora 16, исправляем это

В соответствии с этой ошибкой, версия PHP 5.3.10, которая входит в Fedora 16 не включает libzip. Но мне для Joomla требуется PHP-модуль libzip, его отсутствие очень сильно ограничивает возможности Joomla. Следуйте шагам ниже, для установки php-модуля libzip: 1 2 3 4 5 6 7 8 9 cd /tmp wget http://pecl.php.net/get/zip-1.10.2.tgz tar zxf zip-1.10.2.tgz cd zip-1.10.2 phpize ./configure make make install rm -fr /tmp/zip-1.10.2.tgz ; rm -fr /tmp/zip-1.10.2 После этого не забудьте создать файл /etc/php.d/zip.ini со строкой внутри extension=zip.so

13 квітня 2016 · 1 хвилина · 78 слів · dimetrius

Nginx - перенаправление на мобильную версию с cookies

Давно искал что-то подобное. Конфигурация nginx позволяет перенаправлять посетителей сайта на мобильную версию по UserAgent‘у. И казалось бы… это совсем не сложно, но у нас есть ещё и плюшки. Плюшки в том что мы можем добавить в адресную строку параметр для переключения на полную версию, или обратно на мобильную. Всё это записывается в cookies и сохраняется на заданное нами время. т.е. людей не будет напрягать то, что их при каждом входе принудительно перенаправляет на мобильную версию, а они то хотят полную. Таким образом принудительное переключение с полной версии на мобильную происходит добавлением example.com?mobile=yes, а переключение с мобильной на полную добавлением example.com?mobile=no 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 #with regex from http://detectmobilebrowsers.com/ #map suggestion via kolbyjack #not tested map $http_user_agent $mobile_agent{ default 0; ~* "android.+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino" 1; ~* "^(1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(di|rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-)" 1; } #set $mobile_rewrite variable set $mobile_rewrite do_not_perform; if($mobile_agent = 1){ set $mobile_rewrite perform; } #check if query arg = yes (example.com?mobile=yes), set variable if ($arg_mobile = 'yes') { add_header Set-Cookie mobile=yes; set $mobile_rewrite perform; } #check if cookie mobile=yes, set variable if ($cookie_mobile = 'yes') { set $mobile_rewrite perform; } #check if cookie mobile=no, break if ($cookie_mobile = 'no') { set $mobile_rewrite do_not_perform; } #check if query arg = no (example.com?mobile=no), break if ($arg_mobile = 'no') { add_header Set-Cookie mobile=no; } #if $mobile_rewrite = perform, do the redirect if ($mobile_rewrite = perform) { return 301 $scheme://mobile.domain.com$request_uri; } Ниже должна быть ссылка на оригинальный скрипт, но она потерялась в процессе очередного переезда :(

13 квітня 2016 · 2 хвилин · 297 слів · dimetrius

Nginx, ipv6 и виртуальные хосты

Пару лет назад думал что настроил на вэб сервере поддержку ipv6, все онлайн тесты проходили на ура. Но сейчас, настроив у себя ipv6, понял что при обращении к сайтам получаю в ответ “403 Forbidden”. Не приятно конечно, но надо что-то делать. Тогда, при настройке, была информация что нужно добавлять в конфиг сервера запись вида 1 listen [::]:80 ipv6only=on; при чём если её добавлять в несколько виртуальных серверов, то nginx выкидывал ошибку. Пришёл к выводу что достаточно одной директивы в конфиге по умолчанию. Ошибался. В общем смысл таков: В конфиге по умолчанию должно быть прописано 1 2 listen 80 default_server; listen [::]:80 default_server ipv6only=on; а в конфигах каждого виртуального хоста прописываем 1 2 listen 80; listen [::]:80; Таким образом все сайты работают с ipv4 и ipv6. Если поддержка ipv6 для сайта не нужна, то строку 1 listen [::]:80; прописывать не нужно! А ошибку “403 Forbidden” получал из-за того, что у меня хост по умолчанию её отдаёт для всех желающих ломиться по IP, или подбирать поддомены.

13 квітня 2016 · 1 хвилина · 164 слів · dimetrius