PHP Manual

Як налаштувати HTTPS / SSL сертифікат - повна інструкція

16. 09. 2019

Obsah článku

При розгортанні протоколу `https` на сайтах клієнтів я часто стикався з різними труднощами, які випливали з нерозуміння питань і занадто великої складності понять.

У цьому уроці я детально описую кроки для отримання та розгортання дійсного сертифікату на веб-сервері.

**У кожному підзаголовку я завжди коротко описую крок для досвідчених користувачів, а внизу обговорюю деталі для початківців.

Попередження:** Весь процес розгортання сертифікату може зайняти більше години і часто проходить з перервами (сайт може бути недоступний).

Вимоги до вхідних даних

Інструкція передбачає, що у нас є доступ до веб-сервера Terminal, що працює під управлінням Linux і використовує Apache.

Для Nginx вся теорія застосовується однаково, просто посилання на файл сертифіката відрізняється.

Підключення до веб-сервера

Підключаємося до сервера по SSH.

  • На Windows рекомендую програму Putty,
  • На Mac або Linux просто використовуйте вбудований термінал.

На Mac або Linux викличте команду:

ssh uživatel@server

Наприклад, я хочу підключитися до користувача root на сайті baraja.cz:

ssh root@baraja.cz

Або користувачеві jan на певну IP-адресу:

ssh jan@127.0.0.1

Після відправлення запиту або буде здійснено безпосереднє з'єднання, або Вам буде запропоновано ввести пароль. При введенні пароля нічого не відображається, тому підтвердіть пароль клавішею введення та дочекайтеся авторизації з'єднання.

Попередження:** Якщо у нас немає прав на дію, нам потрібно їх призначити. Або переходимо безпосередньо до користувача root командою udo su, або перед командою, яку хочемо виконати під root, ставимо на початку слово root, наприклад root rm <name> під root видалить файл <name>. При використанні команди "sudo" періодично може з'являтися запит на введення пароля.

Деталі: Деталі:.

Доступ по SSH налаштовується конкретним хостингом, де ви орендували сервер.

  • У випадку з VPS у вас завжди буде доступ по SSH.
  • У випадку з хостингом, ви можете взагалі не отримати SSH, а конфігурація робиться по-іншому (зазвичай через веб-інтерфейс, або звернутися до служби підтримки).

Перехід з HTTP на HTTPS

Якщо ви конвертуєте існуючий сайт з http на https, вам необхідно гарантувати, що весь трафік буде перенаправлений на новий протокол https.

У випадку з Apache цього можна легко досягти за допомогою перенаправлення у файлі .htaccess:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} !on
RewriteRule .? https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</IfModule>

Така конфігурація забезпечить перенаправлення всіх запитів на http з HTTP кодом 301 на https. Ця конфігурація є стандартною для фреймворку Nette, але застосовується також у всіх інших випадках.

Деталі: Деталі:.

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

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


Іноді трапляється так, що .htaccess не хоче добре співпрацювати і конфігурація вкрай складна (наприклад, для багатьох доменів, кожен з яких поводиться по-різному). В такому випадку перенаправлення на HTTPS може бути оброблено безпосередньо в PHP в крайньому випадку:

if (empty($_SERVER['HTTPS']) || $_SERVER['HTTPS'] === 'вимкнено') {
$location = 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
header('HTTP/1.1 301 301 Переміщено назавжди');
header('Місцезнаходження:' . preg_replace('/^(https:\/\/(?:www\.)(.*)$/', '$1$2', $location));
die;
}

Помістіть скрипт в index.php. Однак, я не рекомендую таке рішення.

Пошук файлів з віртуальними хостами

У випадку з Apache нам потрібно знайти файл Virtual hosts.

Зазвичай вони знаходяться по шляху /etc/apache2/sites-available.

Перелічимо вміст каталогу командою ls -al і знайдемо файл, в якому налаштована віртуальна для нашого сайту.

VirtualHosts зазвичай знаходяться у файлах з розширенням .conf. Значення за замовчуванням часто знаходиться в 000-default.conf.

Деталі: Деталі:.

  • Каталог відкривається командою cd, наприклад cd /etc/apache2/sites-available.
  • Вміст файлу записується в Термінал за допомогою команди cat <ім'я>, або редагується за допомогою команд nano <ім'я> або vim <ім'я>.
  • Зазвичай доступ до редактора здійснюється за допомогою комбінації клавіш CTRL + X або подвійного натискання клавіші ESC.
  • Частково переглядати файли в графічному інтерфейсі можна за допомогою Midnight commander (команда mc), який у випадку Ubuntu встановлюється просто командою apt-get install mc або udo apt-get install mc.

Налаштування віртуального хоста для порту 443

Усередині віртуального хоста потрібно підготувати новий для порту 443 (поширеною проблемою може бути блокування порту 443 на брандмауері).

Вміст файлу може виглядати, наприклад, так:

<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerName baraja.cz
ServerAdmin jan@barasek.com
DocumentRoot /var/www/baraja.cz/www
Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"
ErrorLog ${APACHE_LOG_DIR}/baraja.cz.ssl.error.log
CustomLog ${APACHE_LOG_DIR}/baraja.cz.ssl.access.log combined
SSLEngine on
SSLCertificateFile /etc/ssl/baraja.cz/baraja.cz.crt
SSLCertificateKeyFile /etc/ssl/baraja.cz/baraja.cz.key
SSLCertificateChainFile /etc/ssl/baraja.cz/rapidssl.crt
SSLProtocol all -SSLv3
SSLCipherSuite ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS
SSLHonorCipherOrder on
SSLCompression off
<FilesMatch "\.(cgi|shtml|phtml|php)$">
SSLOptions +StdEnvVars
</FilesMatch>
<Directory /usr/lib/cgi-bin>
SSLOptions +StdEnvVars
</Directory>
BrowserMatch "MSIE [2-6]" nokeepalive ssl-unclean-shutdown downgrade-1.0 force-response-1.0
# MSIE 7 and newer should be able to use keepalive
BrowserMatch "MSIE [17-9]" \
ssl-unclean-shutdown
</VirtualHost>
</IfModule>

На досьє - найважливіші ділянки:

SSLEngine on
SSLCertificateFile /etc/ssl/baraja.cz/baraja.cz.crt
SSLCertificateKeyFile /etc/ssl/baraja.cz/baraja.cz.key
SSLCertificateChainFile /etc/ssl/baraja.cz/rapidssl.crt

Розуміння цієї конфігурації є абсолютно критичним. Якщо вам потрібно знайти більш детальну інформацію в Google, використовуйте слова SSLCertificateFile, SSLCertificateKeyFile та SSLCertificateChainFile, які є загальними для всіх серверів Apache.

Попередження:** Проблема SSL є відносно старою, і для підтримки зворотної сумісності часто використовуються різні назви для однієї і тієї ж речі! Тому важливо розуміти принцип.

Деталі: Деталі:.

Важливо, що VirualHost містить:

  • <IfModule mod_ssl.c> каже, що ми хочемо використовувати SSL
  • <VirtualHost *:443>, що вся комунікація буде проходити по порту 443
  • SSLEngine on, що SSL включений для цього VirtualHost'а.
  • Файли SSLCertificateFile, SSLCertificateKeyFile та SSLCertificateChainFile є файлами з певними ключами.

Більше нічого не потрібно.

Розуміння принципу того, що ми збираємося робити і як працює сертифікат

У фінальній конфігурації VirtualHost нам реально знадобляться тільки 3 файли SSLCertificateFile, SSLCertificateKeyFile і SSLCertificateChainFile, які ми можемо розмістити в будь-якому місці на сервері (ім'я і розташування не мають значення). Важливо вказати робочий шлях і переконатися, що вміст файлів є дійсним.

Конкретний спосіб отримання сертифікатів може відрізнятися в різних АЦСК. Головне - зрозуміти принцип, а потім застосувати його до свого випадку.

Файл "Значення
Файл сертифіката SSLCertificateFile
Файл ключа SSL-сертифіката
SSLCertificateChainFile

Отримання приватного ключа та запит сертифікату

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

Для генерації ключа скористайтеся командою:

openssl req -new -newkey rsa:2048 -nodes -keyout yourdomain.key -out yourdomain.csr

Для його генерації нам необхідно, щоб на сервері була встановлена програма openssl, яку ми можемо отримати, наприклад, виконавши команду udo apt install openssl.

Ключів може бути декілька видів, в даному випадку ми генеруємо ключ RSA довжиною 2048 байт (rsa:2048).

Результатом виконання команди є 2 файли (які ви називаєте відповідно до вашого домену):

  • yourdomain.key - це приватний ключ. Збережіть шлях до цього ключа в Apache VirtualHost в файлі SSLCertificateKeyFile.
  • yourdomain.csr - це "запит на сертифікат", або запит на видачу сертифіката.

Зміст запиту обов'язково має бути поданий на затвердження ОА. Зазвичай це робиться через веб-інтерфейс в адмініструванні на сайті, де продаються сертифікати. Затвердження запиту варіюється в залежності від типу сертифіката. Найчастіше це робиться автоматично роботом і займає від 5 хвилин до 8 годин. У випадку дорогих сертифікатів, де також перевіряється фізичне володіння ділянкою та компанія-оператор, перевірка здійснюється вручну і може зайняти кілька днів.

Якщо ви поспішаєте, є сертифікаційне агентство Let's encrypt, яке авторизує запити автоматично з терміном дії 3 місяці.

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

Отримання ключа для конкретного ЦСК/органу безпеки

А поки ми чекаємо на схвалення запиту та видачу сертифікату, ми забезпечимо захист відкритого ключа ЦСК. В Apache VirtualHost він представлений файлом SSLCertificateChainFile (англійською мовою він називається Intermediate and Root CA). Цей ключ в принципі є загальнодоступним і повідомляє веб-браузеру, хто є ЦС. Цей файл зазвичай завантажується з веб-сайту Омбудсмена або надсилається нам електронною поштою.

Ви завжди повинні завантажувати правильний ключ відповідно до обраного вами алгоритму. У випадку з RapidSSL, наприклад, його можна завантажити тут: https://knowledge.digicert.com/generalinformation/INFO1548…

Отримання сертифікату

На підставі запиту центр сертифікації видав нам сертифікат. У випадку з Apache VirtualHost він представлений файлом SSLCertificateFile.

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

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

Перевірте та внесіть зміни

Правильність налаштувань Apache можна частково перевірити за допомогою команди apache2ctl -S.

Для того, щоб зміни вступили в силу, необхідно перезапустити Apache, наприклад, командою:

sudo service apache2 restart

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

У разі помилки викликаємо команду apache2ctl -S, яка може показати шлях до логів, де можна приблизно побачити, що не так. Важливо виконувати всі дії в цьому посібнику в правильному порядку і не переставляти місцями жодну з клавіш.

Майбутня підтримка

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

Ви можете зробити процес продовження та отримати новий сертифікат паралельно, поки працює поточний, а потім просто замінити його одночасно.

Для автоматичного продовження рекомендую [Certbot] (https://certbot.eff.org), який може автоматично відстежувати термін дії та продовжувати сертифікати. Поновлення відбувається, наприклад, за допомогою cron, який раз на місяць вночі викликає команду на видачу нового сертифікату і відразу ж його розгортає.

Якщо ви не розбираєтеся в управлінні сертифікатами, варто звернутися до перевіреної компанії, яка надасть вам функціональний хостинг, включаючи сертифікат. Це позбавить вас від багатьох клопотів.

Jan Barášek   Více o autorovi

Autor článku pracuje jako seniorní vývojář a software architekt v Praze. Navrhuje a spravuje velké webové aplikace, které znáte a používáte. Od roku 2009 nabral bohaté zkušenosti, které tímto webem předává dál.

Rád vám pomůžu:

Související články

1.
Status:
All systems normal.
2024