Як встановити заголовок HSTS із .htaccess лише на HTTPS [закрито]


82

Мій веб-додаток працює на різній кількості хостів, якими я керую. Щоб уникнути необхідності змінювати конфігурацію Apache кожного vhost, я додаю більшу частину конфігурації, використовуючи файли .htaccess у своєму репо, тому основне налаштування кожного хосту - це лише кілька рядків. Це також дає можливість змінити конфігурацію при розгортанні нової версії. В даний час .htaccess (un) встановлює заголовки, робить деякі переписування магії та контролює кешування UA.

Я хочу увімкнути HSTS у програмі за допомогою .htaccess. Просто встановити заголовок просто:

Header always set Strict-Transport-Security "max-age=31536000"

Але в специфікації чітко зазначено: "Хост HSTS НЕ ПОВИНЕН включати поле заголовка STS у відповіді HTTP, що передаються через незахищений транспорт.". Тому я не хочу надсилати заголовок, надсилаючи його через з'єднання HTTP. Див. Http://tools.ietf.org/html/draft-ietf-websec-strict-transport-sec-14 .

Я намагався встановити заголовок, використовуючи середовище vars, але я там застряг. Той, хто знає, як це зробити?


Stack Overflow - це сайт для питань програмування та розробки. Здається, це питання не є темою, оскільки мова не йде про програмування чи розробку. Подивіться, які теми я можу запитати тут, у довідковому центрі. Можливо, кращим місцем для запитання буде Super User або Unix & Linux Stack Exchange . Також див. Де можна розмістити запитання про Dev Ops?
jww

6
@jww. Файли .htaccess є частиною мого репозиторію веб-програми та підтримуються розробниками, щоб отримати бажану поведінку програми (наприклад, кешування, переписування URL-адрес та встановлення правильних заголовків). Питання переглядається тут майже 20 тис. Разів на SO (і доступні теги [apache], [.htaccess] та [mod-headers]). Тому я не думаю, що тут це не в темі.
nielsr

1
"Файли .htaccess є частиною мого репозиторію веб-програми та підтримуються розробниками ..." - також не є критеріями для включення в Stack Overflow. Хороший тест на нюхання: чи можете ви показати свій код? У цьому випадку відповідь - НІ. Після обстеження це просто запитання про конфігурацію Apache. "Питання переглядається майже 20 тис. Разів ..." - Переповнення стека - це смітник. Тут задається поза темою запитання, а потім воно індексується пошуковою системою. Інші приклади явища включають передачу файлів через SSH . Розробники теж використовують SSH зрідка.
jww

Відповіді:


113

Очевидно, є доступна змінна середовища HTTPS, яку можна легко використовувати. Для людей з тим самим питанням:

Header set Strict-Transport-Security "max-age=31536000" env=HTTPS

2
в якому файлі зроблено це налаштування?
ted.strauss

7
@ ted.strauss це було б у .htaccessфайлі.
дзен

З якоїсь причини це не працює на моєму сервері. Apache 2.4
Енді,

14
Не працював і у мене; однак додавання "expr=%{HTTPS} == 'on'"спрацювало. Тоді вся лінія є Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" "expr=%{HTTPS} == 'on'". Може, це тому, що alwaysключове слово?
Адріан Федер,

3
Зверніть увагу, що HTTPS env var в умові env=HTTPSвідрізняється від серверного var, який ми зазвичай бачимо в умовах mod_rewrite (та Apache expr) як %{HTTPS}. Оскільки це змінна env , вона залежить від середовища, тобто. конфігурація сервера. Іноді це ніколи не встановлюється. Іноді призначається таке ж значення , як HTTPSвар сервер (так він завжди повинен бути встановлений або «вимкнено» або «на» - і умова env=HTTPSє завжди вірно! env=HTTPSПросто перевіряє , чи є окр вар встановити, чи не то, що він «на» .) Використовувати Apache expr, як пропонує @ AdrianFöder, рекомендується на Apache
2.4+

29

Щоб спиратися на відповідь nielsr, я використав наступне в .htaccess, щоб задовольнити рекомендації щодо безпечного розгортання на https://hstspreload.org, що дозволить жорстко закодувати домен у браузері Chrome. Майте на увазі, що це буде застосовувати HSTS для всіх ваших субдоменів, і що включення до списку попереднього завантаження не можна легко скасувати, тому rtfm.

<IfModule mod_headers.c>
Header set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" env=HTTPS
</IfModule>

6
Це трохи безпечніше так - якщо ви коли-небудь збираєтесь використовувати HTTPS у всьому домені. Якщо ні, це неймовірно небезпечно - і тому безвідповідально пропонувати це, не попереджаючи про це. Скажімо, ваш веб-сервер відповідає цим заголовком на запит у домені верхнього рівня (example.com) - тоді як ви включаєте піддомени будь-який інший піддомен, який обслуговується іншим веб-сервером лише через http, а не https (наприклад, intranet.example.com) , не буде працювати. Включення тегу попереднього завантаження також дозволяє надсилати його до списку попереднього завантаження, щоб він був закодований у веб-браузерах, а потім незворотний.
Barry Pollard

Через кілька років, тому я лише зауважую, що ваш фрагмент все ще діє на сьогодні.
KGIII

6

Ви можете використовувати це та розмістити у своєму файлі htaccess, щоб відповідати https://hstspreload.org . помістіть це у свій файл .htaccess.

RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]

RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L,E=HTTPS:1]
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" env=HTTPS

по-перше, він зробить переспрямування для не https на https. і перенаправити не-https https на www https із заголовком HSTS.

( http://example.com -> https://example.com -> https://www.example.com - із заголовком HSTS)

Перевірено та відповідає https://hstspreload.org


4

Для httpd.conf(якщо у вас є доступ для редагування цього) ви можете використовувати

<VirtualHost 65.81.122.43:443>
    Header always set Strict-Transport-Security "max-age=31536000; includeSubdomains;"
</VirtualHost>

ПРИМІТКА. Вам потрібно встановити його лише на HTTPS vhost, а не на http vhost.

Коли слід, і чи не слід використовувати файли .htaccess?

Дозвіл .htaccess файлів змусить Apache шукати їх при кожному доступі до вашого сервера. Оскільки батьківські каталоги також шукаються, це займе деякий (невеликий) час і може вплинути на продуктивність вашого сервера. Джерело


Apache завжди буде шукати файли .htaccess. Отже, якщо ви не вимкнули пошук .htaccess, це не покращить продуктивність, оскільки Apache все одно перевірить наявність файлу.
Rudy Broersma

1

Ще однією альтернативою є завжди встановлювати заголовок і умовно видаляти його для не-ssl-з'єднань:

Header always set   Strict-Transport-Security "max-age=31536000" early
Header        unset Strict-Transport-Security env=!HTTPS

Це має ту перевагу, що Header директиву можна використовувати як з envумовою, так і з earlyпрапором. Завдяки одній Headerдирективі envта earlyне можуть використовуватися разом, вони взаємовиключні (див. Офіційну документацію: https://httpd.apache.org/docs/current/mod/mod_headers.html#header ).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.