Инструменты пользователя

Инструменты сайта


wiki:tips:httpslogin

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

wiki:tips:httpslogin [2024/08/09 01:59] – создано vladpolskiywiki:tips:httpslogin [2024/08/09 04:01] (текущий) vladpolskiy
Строка 1: Строка 1:
 ======Принудительный вход через HTTPS====== ======Принудительный вход через HTTPS======
 +=====Плагины=====
 +====forcessllogin====
 +См. https://www.dokuwiki.org/plugin:forcessllogin, похоже, не отражает доступ SSL в URL , т.е. страница «Докувики», доступ к которой запрещен, не будет открыта по протоколу https, что затрудняет отладку и обеспечение безопасного входа в систему.
 +=====Апачи=====
 +Используя mod_rewrite Apache, можно принудительно использовать HTTPS для входа в DokuWiki, тем самым предотвращая передачу паролей в открытом виде.
 +
 +Вам также может понадобиться, чтобы все запросы (а не только вход) использовали HTTPS. Для этого создайте файл .htaccess в корневом каталоге DokuWiki и вставьте следующий код.
 +
 +<code apache .htaccess>
 +RewriteCond %{HTTPS} !on
 +RewriteRule (.*) https://%{HTTP_HOST}/$1 [R,L]
 +</code> 
 +
 +Если вы хотите принудительно задать только какой-то определенный URL , сначала прочтите статью [[wiki:rewrite|о перезаписи URL]].
 +
 +Перенаправление на защищенное соединение, которое ограничено определенным набором страниц (например, страницы входа), требует их распознавания на основе URL . Некоторые страницы (например, страницы «доступ запрещен», которые могут быть включены только в более новых версиях, например, 2014-05-05 «Ponder Stibbons» <ref> https://www.dokuwiki.org/plugin:ondeniedlogin </ref>) не включают такую ​​метку и не могут быть отделены от остальных URL (к которым может потребоваться доступ без защищенного соединения для экономии ресурсов сервера).
 +
 +FIXME Остальная часть параграфа обрабатывает только запросы с ''?do=login'' запросом GET, который не охватывает по крайней мере страницы «доступ запрещен»! Необходимо исследование правила перенаправления для всех запросов аутентификации по HTTP.
 +Смотрите обсуждение для решения.
 +
 +Далее предполагается, что вы уже настроили поддержку HTTPS для своей вики, сделав ее доступной по HTTP и HTTPS по одному и тому же адресу. По соображениям производительности только вход в систему и обновления профиля должны быть принудительно переведены на HTTPS, в то время как все «нормальные» действия вики будут продолжать работать по HTTP.
 +
 +Поскольку вам необходимо настроить куки через HTTPS для работы на HTTP, вам необходимо сначала отключить опцию securecookie . Затем приступайте к настройке перенаправления в вашем ''.htaccess'':
 +
 +<code apache>
 +# Переключиться на безопасный режим при входе в систему, профиле и действиях администратора 
 +RewriteEngine On
 +RewriteCond %{HTTPS} !on
 +RewriteCond %{QUERY_STRING} do=(log|profile|admin)
 +RewriteRule ^(.*) https://%{HTTP_HOST}/$1 [R,QSA,L,NE]
 +
 +# Изменить обратно на небезопасный режим при показе действия 
 +RewriteCond %{HTTPS} on
 +RewriteCond %{QUERY_STRING} !do=(log|profile|admin)
 +RewriteCond %{REQUEST_METHOD} GET
 +RewriteRule ^(.*) http://%{HTTP_HOST}/$1 [R,QSA,L]
 +</code>
 +
 +Возможно, вы захотите изменить ''${HTTP_HOST}'' его на ''${SERVER_NAME}'', где имя сервера совпадает с именем хоста в вашем SSL-сертификате.
 +
 +Примечания:
 +
 +  * выше переключает обратно на не-SSL только на действии show. Это означает, что переключение может не произойти немедленно после входа, но гарантирует отсутствие предупреждений о «смешанном контенте» во время операции SSL.
 +  * если у вас есть другие правила переписывания, например, те, которые [[wiki:rewrite|используются при общем переписывании]], поместите эти правила перед остальными.
 +  * Если каталог установки DokuWiki не является корневым каталогом (например, http://example.com/wiki/) , вам необходимо добавить этот дополнительный путь к строкам 5 и 11 приведенного выше фрагмента, что будет выглядеть примерно так:''RewriteRule ^(.*) http://%{HTTP_HOST}/wiki/$1 [R,QSA,L]''
 +
 +====защищенный cookie====
 +
 +**Обратите внимание**: вам необходимо отключить « securecookie », ''conf/dokuwiki.php'' чтобы приведенный выше код работал. В противном случае ваши входы не будут успешно регистрироваться. Это происходит потому, что при включенном securecookie сеансовый cookie, созданный во время входа HTTPS, не может быть отправлен по HTTP, и сеанс теряется.
 +
 +====nginx====
 +
 +Такая настройка также возможна в nginx, но с небольшой доработкой fastcgi_params.
 +
 +Во-первых, вам нужно иметь отдельные экземпляры сервера, для ''http'' и ''https'' каждый, чтобы поддерживать чистоту (и ''rewrite'' не запутаться и не попасть в ловушку redir loops). Это может выглядеть так. Каждый экземпляр имеет свое собственное правило перезаписи для переключения с http на https.
 +
 +<code nginx>
 +# Протестировано с nginx 0.8.5
 +# В http-контексте вашей конфигурации nginx
 +map $scheme $php_https { default off; https on; }
 +
 +    server {
 + server_name wiki.host.org
 + root /path/to/dokuwiki;
 + index doku.php;
 + listen 80;
 + #Enforce https for logins, admin
 + if ($args ~* do=(log|admin|profile)) {
 + rewrite ^ https://$host$request_uri? redirect;
 + }
 + include dokuwiki.conf;
 +    }
 +
 +    server {
 + server_name wiki.host.org;
 + root /path/to/dokuwiki;
 + index doku.php;
 + listen 443 ssl;
 + keepalive_requests    10;
 + keepalive_timeout     60 60;
 + ssl_certificate      /etc/ssl/certs/ssl-cert-snakeoil.pem;
 + ssl_certificate_key  /etc/ssl/private/ssl-cert-snakeoil.key;
 + #switch back to plain http for normal view
 +
 + if ($args ~* (do=show|^$)){
 + rewrite ^ http://$host$request_uri? redirect;
 + }
 + include dokuwiki.conf;
 +    }
 +</code>
 +
 +В ''dokuwiki.conf'' (тот же путь, что и у вашего nginx.conf) вы можете использовать [[http://wiki.nginx.org/Dokuwiki|фрагмент из вики nginx]], но вам __нужно__ добавить
 +
 +<code nginx>
 +fastcgi_param HTTPS $php_https;
 +</code>
 +
 +в ваш fastcgi_params. Этот параметр и ''map'' директива в начале обязательны, поскольку Dokuwiki проверяет $_SERVER['HTTPS'] для работы.
 +
 +Как и в случае с Apache, вам необходимо отключить Securecookie в вашем ''conf/dokuwiki.php''.
 +
 +=====HTTPS на основе PHP=====
 +Ниже полезно, если вы хотите принудительно использовать https-соединение ВСЕГДА (не только для входа) и не хотите полагаться на Apache или NGINX htaccess или другие специфичные для сервера директивы. Поместите следующие строки в начало файла шаблона в '''…lib/tpl/template-name/main.php'''
 +
 +<code php>
 +<?php
 +if ($_SERVER[HTTPS]!="on") {
 +  //$strURIName=$_SERVER['SERVER_NAME'] . getenv("REQUEST_URI"); 
 +  // Функция 'getenv' не работает, если ваш API сервера - ASAPI (IIS). 
 +  // Поэтому постарайтесь использовать не getenv('REMOTE_ADDR'), а $_SERVER["REMOTE_ADDR"].
 +  $strURIName= $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI'];
 +  header ("Location: https://$strURIName");
 +  // Если это не работает для вас и вам нужно устранить неполадки в вашем PHP-коде, 
 +  // раскомментируйте ниже, чтобы узнать о ваших конкретных переменных сервера 
 +  /*
 +  echo "<b>_SERVER Variables from $_SERVER</b><br><br>";
 +  reset($_SERVER);
 +  while (list ($key, $val) = each ($_SERVER)) {
 +  print $key . " = " . $val . "<br>";
 +  }
 +  */
 +}
 +?>
 +</code>
 +
 +Спасибо. Это спасло мой день!
 +
 +[[https://www.dokuwiki.org/tips:httpslogin#discussion|Обсуждение]]
wiki/tips/httpslogin.1723157968.txt.gz · Последнее изменение: vladpolskiy