Чи погано перенаправляти http на https?


247

Щойно я встановив на своєму сервері сертифікат SSL.

Потім він встановив переспрямування для всього трафіку в моєму домені на Порт 80, щоб перенаправити його на Порт 443.

Іншими словами, весь мій http://example.comтрафік зараз перенаправлений на відповідну https://example.comверсію сторінки.

Переспрямування виконується у моєму файлі віртуальних хостів Apache з чимось подібним ...

RewriteEngine on
ReWriteCond %{SERVER_PORT} !^443$
RewriteRule ^/(.*) https://%{HTTP_HOST}/$1 [NC,R,L] 

Моє запитання: чи є недоліки використання SSL?

Оскільки це не перенаправлення 301, чи я втрачу сік посилання / рейтинг у пошукових системах, перейшовши на https?

Я ціную допомогу. Я завжди хотів налаштувати SSL на сервер, просто для практики цього робити, і нарешті вирішив це зробити сьогодні ввечері. Здається, це працює добре до цього часу, але я не впевнений, чи корисно це використовувати на кожній сторінці. Мій сайт не є електронною комерцією та не обробляє конфіденційні дані; це головним чином для зовнішнього вигляду та хвилювання від встановлення його для навчання.


ОНОВЛЕННЕ ПИТАННЯ

Як не дивно, Bing створює цей знімок екрана з мого сайту тепер, коли він використовує HTTPS скрізь ...

введіть тут опис зображення


12
[WTF - я не можу додати відповідь (хоча, здається, у мене є достатня кількість представників). Моєю відповіддю (частково) буде те, що САМЕТИ , ЩО БУДЕ НЕГО . Розгляньте можливість передачі ключа COOKIE або API в GET через HTTP. Якщо ваш веб-сайт перенаправляє HTTP-запити на HTTPS-запити, ці дзвінки спрацюють, але ключ COOKIE або API буде передано в явному вигляді. Деякі API відключають HTTP, більш надійний підхід - взагалі немає HTTP, так що ви навіть не можете працювати, якщо не використовуєте HTTPS. Приклад: "Усі запити API повинні здійснюватися через HTTPS. Виклики, здійснені через звичайний HTTP, не вдаються" від stripe.com/docs/api?lang=php#authentication
codingoutloud

8
@codingoutloud - альтернатива полягає в тому, що вся справа відбувається через HTTP без HTTPS взагалі. Як це краще?
Марк Хендерсон

3
@BenCrowell, це тому, що захоплений портал виглядає надзвичайно багато, як sslstripатака переадресації у стилі (вони обидва викрадають запит "людина-в-середині"), тому веб-переглядачі HSTS заблокують їх обох.
Джефрі Хантін

3
мати в виду , що при використанні протоколу HTTPS означає все , що включають в себе також має бути по протоколу HTTPS або він не може завантажити - наприклад , навантаження JQuery з використанням src="://example.com/jquery.js"- зверніть увагу на відсутність httpабо httpsщоб браузер завантажує відповідний. У мене був кошмар, який намагався змусити якісь вбудовані речі Amazon завантажуватися належним чином, оскільки API (завантажений через https) створював http-посилання - це означає, що вони не працювали належним чином, поки я не знайшов незадокументований параметр для перемикання https-посилань
Basic

3
Джейсон; ваше оновлення має бути новим питанням, можливо, для веб-майстрів, оскільки воно не пов'язане (технічно) з початковим запитанням. Але, мабуть, ваші таблиці стилів походять із незахищеного домену.
Марк Хендерсон

Відповіді:


316

[R]Прапор сам по собі є 302перенаправленням ( Moved Temporarily). Якщо ви дійсно хочете, щоб люди, які використовують версію HTTPS вашого веб-сайту (підказка: ви це робите), вам слід використовувати [R=301]для постійного переадресації:

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

301Зберігає всі ваші Google-фу і кровні ваги PageRank недоторканим . Переконайтесь, що mod_rewriteввімкнено:

a2enmod rewrite

Щоб відповісти на ваше точне запитання:

Чи погано перенаправляти http на https?

Ніяк ні. Це дуже добре.


3
Дякую за інформацію, мій начальник розповідає мені про те, що він працює тільки https на певних сторінках свого сайту, це те, що він використовує набагато більше ресурсів сервера для запуску на кожній сторінці. Чи знаєте ви щось про це чи це правда?
JasonDavis

9
@jasondavis Тільки якщо ви не витратите кілька хвилин на її оптимізацію .
Майкл Хемптон

10
"він використовує набагато більше ресурсів сервера для запуску на кожній сторінці." Сучасні процесори мають функції прискорення шифрування, завдяки чому SSL майже безкоштовний. Не турбуйтеся про накладні витрати.
Адам Девіс

41
@AdamDavis Крипто алгоритм може бути легким, але рукостискання все ще існує. Також HTTPS не дозволяє HTTP-проксі-серверам кешувати ваш вміст. У більшості випадків накладні витрати HTTPS мінімальні та варті, але будьте обережні щодо надмірного узагальнення.
200_успіх

6
Це вбиває кешоване спільне використання, що корисно для моделей використання деяких сайтів і часто мало захищає (чи важливо, щоб люди могли знати, що ви відвідували сайт, але не деталі того, що ви робили? Це єдиний варіант, коли SSL корисний). Основна перевага SSL на кожному ресурсі полягає не в тому, що вам потрібно "захищати", наприклад, людей, які дивляться на "про нас", а в тому, що ви не можете підсунути і не використовувати його у випадку, коли вам слід.
Джон Ханна

49

Хоча я підтримую ідею сайтів, що стосуються лише SSL, я б сказав, що один недолік - накладні витрати залежно від дизайну вашого сайту. Я маю на увазі, наприклад, якщо ви розміщуєте безліч окремих зображень у тегах img, це може призвести до того, що ваш сайт працює набагато повільніше. Я б порадив усім, хто використовує лише сервери SSL, щоб переконатися, що вони працюють на наступному.

  1. Перевірте весь сайт на наявність внутрішніх посилань і переконайтеся, що вони використовують HTTPS, якщо ви вказали своє власне доменне ім’я у посиланнях, щоб не викликати ваші власні переадресації.
  2. Оновіть свою програму <meta property="og:url"за допомогою https-версії вашого домену.
  3. Якщо ви <base href=знову використовуєте оновлення для використання HTTPS.
  4. Якщо можливо, встановіть протокол SPDY
  5. Обов'язково використовуйте спрайти зображень CSS, де це можливо, щоб зменшити кількість запитів.
  6. Оновіть ваші мапи сайту, щоб вказати статус https, тому павуки з часом дізнаються про цю зміну.
  7. Змініть налаштування пошукової системи, як-от Інструменти Google для веб-майстрів, щоб віддати перевагу HTTPS
  8. Де можливо, завантажте будь-які статичні носії на HTTPS-сервери CDN.

Якщо зазначене вище буде вирішено, я сумніваюся, у вас буде багато питань.


SPDY - хороша пропозиція; там навіть , здається, модуль додавання підтримки SPDY в Apache 2.x .
Кальріон

18
Використання "//yourserver.com/some-uri" замість " yourserver.com/some-uri " вирішує проблему (1), оскільки браузер вибере відповідну схему (http або https) залежно від схеми, на яку завантажена сторінка. .
MauganRa

1
@MauganRa Якщо, звичайно, це посилання зі сторінки статті http на сторінку входу https, наприклад.
Mołot

4
Google бачить URL-адресу, який відвідує хтось через Refererзаголовок. Наприклад, цей сайт використовує jQuery з CDN Google, і мій браузер надсилає запит Google кожен раз, коли я перезавантажую сайт. Тим самим Refererзаголовок також надсилається в Google, який встановлений за URL-адресою цього сайту. Таким чином Google може відслідковувати сайти, які я відвідую, протягом моєї зміни IP-адреси (і якщо я використовую службу Google протягом цього часу, Google також може з'єднати цю інформацію з моїм обліковим записом Google).
Стефан Кулла

1
Для 1) Я щойно здійснив пошук та заміну в моїй базі даних MySQL http на https ... я використовую WordPress, тому це стало реально легко оновлювати сотні посилань
JasonDavis

38

Я встановив https, то вам слід користуватися ним скрізь на сайті. Ви уникнете ризику виникнення змішаних проблем із вмістом, і якщо у вас є необхідні інструменти, чому б не зробити весь сайт захищеним?

Щодо перенаправлення з http на https, відповідь не така проста.

Перенаправлення значно полегшить ваших користувачів, вони просто вводять на whateversite.com і перенаправляються на https.

Але. Що робити, якщо користувач іноді перебуває в незахищеній мережі (або близький до Трої Хант та його Ананаса )? Тоді користувач запитає http://whateversite.com за старою звичкою. Це http. Це може бути поставлено під загрозу. Переспрямування може вказувати на https://whateversite.com.some.infrastructure.long.strange.url.hacker.org . Звичайному користувачеві це буде виглядати цілком законно. Але трафік можна перехопити.

Тож у нас є дві конкуруючі вимоги: бути зручним для користувачів та бути захищеним. На щастя, існує засіб, який називається заголовком HSTS . За допомогою нього можна включити переадресацію. Браузер перейде на захищений сайт, але завдяки заголовку HSTS також запам'ятайте його. Коли користувач набере в whateversite.com, що сидить у тій незахищеній мережі, браузер одразу перейде на https, не перестрибуючи переспрямування через http. Якщо ви не маєте справу з дуже чутливими даними, я думаю, що це справедливий компроміс між безпекою та зручністю використання більшості сайтів. (Коли я нещодавно створив програму, яка обробляє медичну документацію, я перейшов усі https без перенаправлення). На жаль, Internet Explorer не підтримує HSTS ( джерело)), тож якщо ваша цільова аудиторія в основному використовує IE і дані чутливі, ви можете вимкнути переадресацію.

Тож якщо ви не орієнтуєтесь на користувачів IE, продовжуйте використовувати переспрямування, але ввімкніть також заголовок HSTS.


На це також потрібно звернути більше людей. Інша справа, що люди припускають, що вони захищені, тому що кінцевою точкою є HTTPS, ігноруючи той факт, що вся інформація, що надсилається на сторінку в GETs або POST, знаходиться у простому тексті.
Велокс

3
@Velox - Я не думаю, що "люди вважають, що вони захищені, оскільки кінцевою точкою є HTTPS, ігноруючи той факт, що вся інформація, що надсилається на сторінку в GETs або POST, є простим текстом" є досить точною. Незважаючи на те, що є деякі проблеми, параметри GET-запитів не пересуваються під час транспортування через HTTPS. Див. Наприклад: stackoverflow.com/questions/323200/… корисні навантаження POST також захищені, але також не є вразливими до заголовків реєстрації та рефералів.
codingoutloud

@codingoutloud Це моя думка. Через HTTPS вони шифруються, але в початковому запиті на сторінку HTTP вони не були.
Велокс

1
@Velox - Якщо весь сайт переспрямовується на HTTPS, навряд чи будь-які параметри GET будуть надіслані до того, як HTTPS запустив (і все залишиться HTTPS після цього пункту). Є ще один початковий запит, куди надсилатимуться файли cookie, які можна виправити за допомогою HSTS ... та невелике вікно атаки для SSLStrip, яке, можливо, може бути переможене JavaScript, але це гонка озброєнь.
Brilliand

@Brilliand Справедливий момент, але слабка точка безпеки робить всю справу слабкою. Завжди варто задуматися.
Велокс

22

У цьому немає нічого поганого, і насправді це найкраща практика (для сайтів, які слід обслуговувати через безпечне з'єднання). Насправді те, що ви робите, дуже схоже на конфігурацію, яку я використовую:

<VirtualHost 10.2.3.40:80>
  ServerAdmin me@example.com
  ServerName secure.example.com
  RedirectMatch 301 (.*) https://secure.example.com$1
</VirtualHost>

# Insert 10.2.3.40:443 virtual host here :)

Код 301стану вказує на постійне переспрямування, вказуючи спроможним клієнтам використовувати захищену URL-адресу для майбутніх з'єднань (наприклад, оновити закладку).

Якщо ви будете обслуговувати сайт лише через TLS / SSL, я рекомендую додаткову директиву, щоб увімкнути жорстку безпеку транспорту HTTP (HSTS) у вашому захищеному віртуальному хості:

<IfModule mod_headers.c>
  Header set Strict-Transport-Security "max-age=1234; includeSubdomains"
</IfModule>

Цей заголовок вказує здібним клієнтам (я вважаю, що сьогодні більшість із них), що вони повинні використовувати HTTPS лише з наданим доменом ( secure.example.comу цьому випадку) протягом наступних 1234секунд. Розділ ; includeSubdomainsє необов'язковим і вказує, що директива застосовується не лише до поточного домену, а до будь-якого під ним (наприклад alpha.secure.example.com). Зверніть увагу , що заголовок HSTS буде тільки прийнятий браузерами , коли подається через / TLS з'єднання SSL!

Щоб перевірити конфігурацію вашого сервера на сучасній кращій практиці, хорошим безкоштовним ресурсом є служба тестування SSL Server Qualys ; Я б мав на меті отримати принаймні A- (ви не можете отримати більше, ніж з Apache 2.2 через відсутність підтримки криптографії еліптичної кривої).


Додам, відправлення заголовка Strict-Transport-Security: max-age=0заперечує будь-яку попередню директиву; як завжди, це повинно бути надіслано через HTTPS, щоб прийняти, але це зручний спосіб скасування речей, якщо ви вирішите, що вам також потрібно використовувати HTTP у домені.
Кальріон

5

Оце Так ! перенаправлення HTTP на HTTPS - дуже гарна річ, і я не можу побачити недоліків для цього.

Просто переконайтеся, що ваші клієнти мають правильний CA, щоб уникнути непривітних попереджень про сертифікат у веб-переглядачі.

Крім того, спосіб налаштування Apache для переадресації на HTTPS здається нормальним.


5

Чи погано перенаправляти http на https?

Ні, зовсім ні. Власне, це добре робити!

Про переадресації:

Це може бути ефективнішим, повністю усунувши переписувачів . Ось мій конфігуратор щодо подібної ситуації ...

<VirtualHost *:80>
  ServerName domainname.com

  <IfModule mod_alias.c>
    Redirect permanent / https://domainname.com/
  </IfModule>
</VirtualHost>

4

HTTPS не є абсолютно надійним. Звичайно, нормально форсувати HTTPS - це добре. Це заважає нормальним злочинцям робити щось погане вашим користувачам.

Але не забудьте перевірити налаштування SSL, як налаштування SSLCiphers. Вимкніть такі речі, як криптовалюта RC4, протокол SSLv2 та SSLv3. Крім того, ви повинні дізнатися, чи підтримують криптовалютні системи вашої системи TLS1.2 (що саме ви хочете мати;))

Увімкніть SSL, це гарна річ.


Ентропія не звикає ( принаймні, якщо ви захищаєтесь від нападників на Землі, а не робите вуду ). Або ви починаєте з недостатньої ентропії, і ви не можете зробити нічого, що вимагає випадковості, або ви починаєте з достатньої ентропії, і ви продовжуєте мати достатню ентропію, незалежно від того, скільки випадкових випадків ви генеруєте.
Жиль

Вибач, що ? У Linux є ряд операцій, які наполягають на сильній ентропії, що походить від апаратних засобів, а не на основі PRNG, можливо, достатньо хорошої ентропії, і вони дійсно можуть блокуватись, якщо глибина пулу невелика. Напевне, можна почати з достатньої ентропії в системі Linux, але, перевтомившись для зливу пулу, що призведе до блокування деяких операцій.
MadHatter

3

Особисто я використовую SSL для захисту з'єднань в Інтернеті, однак я вважаю, що всі інші відповіді тут пропущені - це те, що не кожен пристрій і програмне забезпечення, здатне до HTTP-з'єднання, зможуть використовувати SSL, таким чином, я б розглядав можливість надання користувачам певного способу уникнути цього, якщо він не підтримується. Можливо також, що людям у деяких країнах, де технологія шифрування є незаконною, тоді заборонятимуть доступ до вашого сайту. Я б розглядав можливість додавання незашифрованої цільової сторінки із посиланням, щоб змусити незахищену версію сайту, але, якщо користувач спеціально не вибере такі дії, як ви сказали, та просто переслати їх до версії HTTPS.


Проблема таких рішень, як наявність звичайної цільової сторінки HTTP, навіть якщо вона належним чином відокремлена, полягає в тому, що ця сторінка залишається відкритою для маніпуляцій. Тобто, немає фактичної гарантії того, що посилання на HTTPS-версію сайту буде недоступною для відвідувачів.
Хокан Ліндквіст

3

Ось деякі з широких питань мазка:

  • MITM / SSLSTRIP : Це величезна застереження. Якщо ви збираєтеся обслуговувати свій сайт через HTTPS, відключіть HTTP на сайті . В іншому випадку ви залишаєте своїх користувачів відкритими для різних атак посереднього типу, включаючи SSLSTRIP, які перехоплюватимуть запити та спокійно обслуговуватимуть їх через HTTP, вставляючи в потік власний скрипт зловмисного програмного забезпечення. Якщо користувач цього не помітить, він вважатиме, що їх сеанс захищений, коли його насправді немає.

    • Проблема в цьому полягає в тому, що якщо ваш сайт є загальнодоступним сайтом і ви просто безцеремонно відключите HTTP, ви можете втратити багато відвідувачів. Це , ймовірно , не буде навіть відбуватися їх спробувати HTTPS , якщо сайт не буде завантажуватися з HTTP.
  • Якщо ваш сайт вимагає безпечного входу, то весь сеанс користувача повинен бути захищений. Не здійснюйте автентифікацію через HTTPS, а потім перенаправляйте користувача назад до HTTP. Якщо знову ж таки, ви залишаєте своїх користувачів уразливими до атак MITM. Стандартний підхід до аутентифікації в ці дні полягає в тому, щоб один раз пройти автентифікацію, потім передати маркер аутентифікації вперед і назад (у файлі cookie). Але якщо ви пройшли автентифікацію через HTTPS, то переспрямуєте на HTTP, тоді людина, що перебуває в середині, може перехопити цей файл cookie та використовувати сайт так, ніби вони є вашим аутентифікованим користувачем, минаючи вашу безпеку.

  • Проблеми щодо "продуктивності" HTTPS для всіх практичних цілей обмежені рукостисканням, що бере участь у створенні нового з'єднання. Зробіть все можливе, щоб мінімізувати потребу в декількох HTTPS-з'єднаннях з URL-адреси, і ви будете милі вперед. І це відверто вірно, навіть якщо ви розміщуєте свій вміст через HTTP. Якщо ви прочитаєте на SPDY, ви зрозумієте, що все, що вона робить, орієнтоване на спробу подати весь вміст з однієї URL-адреси за допомогою одного з'єднання. Так, використання HTTPS впливає на кешування. Але скільки веб-сайтів є лише статичним, кешованим вмістом у ці дні? Ви, ймовірно, отримаєте більше ударів за свій долар, використовуючи кешування на веб-сервері, щоб мінімізувати зайві запити до бази даних, отримуючи незмінні дані знову і знову, і запобігаючи виконанню дорогих кодових шляхів частіше, ніж потрібно.


Те, що ви можете зробити, щоб насправді адресувати sslstrip - це використовувати HSTS (бажано, щоб ваші налаштування HSTS були попередньо завантажені ). Приймаєте ви запити через звичайний HTTP чи ні, насправді це не має значення в цьому плані, MITM може відповідати на звичайний HTTP (можливо, наближаючись до вашого сайту HTTPS), навіть якщо ви приймаєте лише запити HTTPS.
Хокан Ліндквіст

@ HåkanLindqvist Я дійсно заробив від тебе зворотну скаргу? Чи давав я погану пораду чи гарну пораду щодо не автентифікації через HTTPS, а потім переходу на HTTP протягом решти сесії? Чи я надав погану пораду щодо міфів щодо ефективності HTTPS? Крім того, якщо клієнт спочатку намагається підключитися за допомогою HTTPS, MITM не може перехопити та відповісти, не викликаючи попередження у веб-переглядачі, оскільки їхній сервер не збігатиметься, якщо у нього не буде викрадений або успішно підроблений сертифікат. З іншого боку, якщо сайт приймає HTTP-з'єднання, перехоплення простіше. Так чи інакше, HTTPS піднімає планку.
Крейг

.. і звичайно, я щиро погоджуюся з використанням HSTS.
Крейг

Моя проблема з відповіддю - це перший пункт у списку, який претендує на адресу sslstrip, а насправді немає (кажучи про міфи). Що я намагався отримати у своєму первинному коментарі, це те, що якщо у вас є активний MITM (що саме вам потрібно для sslstrip в першу чергу), зловмисник може по суті бути "сайтом" з точки зору клієнта; саме зловмисник вирішує, чи хочуть вони прийняти звичайні HTTP-з'єднання від клієнта, як ваш фактичний веб-сервер поводиться в цьому відношенні не впливає на те, що може або буде робити зловмисник.
Хокан Ліндквіст

@ HåkanLindqvist За винятком того випадку, якщо відвідувач навмисно намагається зв’язатися з HTTPS, зловмисник не може задовольнити цей запит, не кидаючи прапори в браузер, якщо їм не вдалося викрасти серверний сертифікат або якось успішно підробити той, який їм доведеться зробити зробіть для того, щоб переключити з'єднання на HTTP. HTTPS все ще піднімає планку. Звичайно, якщо відвідувач зробить початкову спробу підключення через HTTP, всі ставки повністю вимкнені.
Крейг

1

Це технічно не є відповіддю на ваш початковий запитання, але якщо ви використовуєте розширення Google Chrome HTTPSEverywhere (я впевнений, що подібні розширення є в інших браузерах), розширення автоматично перенаправляє сайти з HTTP на той самий сайт із HTTPS. Я використовую його деякий час, і у мене не було жодних проблем (крім, можливо, уповільнення, але я цього не перевіряв). HTTPSEвсюди можна змінити певними правилами на стороні сервера, але оскільки я в цій області не зробив багато, я не впевнений у точних деталях.

Повертаючись до свого актуального питання, якщо ви використовуєте щось на зразок HTTPSEverywhere, є ще менше стимулів використовувати лише HTTP, хоча я думаю, що важко встановити правильні правила, коли вони вам потрібні.


1

єдиний технічний зворот HTTPS через HTTP полягає в тому, що обробляти обчислювальні запити HTTPS обчислювально, ніж звичайний HTTP

Однак, враховуючи, що більшість сучасних серверів мають потужний процесор, цей вплив, як правило, незначний, якщо ви не знаходитесь на надзвичайно високому рівні трафіку, в який момент ви швидше використовуєте балансири навантажень

З появою таких протоколів, як SPDY, які вимагають роботи SSL / TLS, це фактично протидіє вищезгаданим обчислювальним накладним витратам, надаючи значні покращення продуктивності щодо декількох запитів і швидше отримуючи активи для клієнта.


Проблема продуктивності HTTPS полягає в тому, що встановлення нового з'єднання дорожче, тому що задіяно більше зворотних поїздок і тому, що асиметричне шифрування / дешифрування набагато дорожче, ніж симетричне шифрування / дешифрування. Після того як рукостискання з'єднання встановлює спільний симетричний ключ шифрування, поточні накладні витрати практично не мають значення (дуже малі). Якщо ви читаєте на SPDY, ви побачите, що мета всіх фантазійних матеріалів, які вони роблять, - це, по суті, обслуговування всього вмісту з URL-адреси через одне з'єднання, пом'якшення рукостискання з'єднання над головою.
Крейг

1

Дуже добре перенаправляти на https, але я читаю, це також залежить від того, як ви організуєте переадресацію.

Створення виділеного віртуального сервера для перенаправлення вхідних запитів http до вашого https-з'єднання, як це пропонується у відповіді на security.stackexchange.com, звучить дуже розумно і закриє деякі додаткові загрози безпеці. Конфігурація в Apache виглядатиме приблизно так:

# Virtual host for rerouting
<VirtualHost *:80>
    ServerName www.example.com
    Redirect permanent / https://www.example.com/
</VirtualHost>

# Virtual host for secure hosting on https
<VirtualHost *:443>
    ServerName www.example.com
    SSLEngine on
    Header set Strict-Transport-Security "max-age=8640000;includeSubdomains"

    ...site settings...

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