При розгортанні протоколу `https` на сайтах клієнтів я часто стикався з різними труднощами, які випливали з нерозуміння питань і занадто великої складності понять.
У цьому уроці я детально описую кроки для отримання та розгортання дійсного сертифікату на веб-сервері.
**У кожному підзаголовку я завжди коротко описую крок для досвідчених користувачів, а внизу обговорюю деталі для початківців.
Попередження:** Весь процес розгортання сертифікату може зайняти більше години і часто проходить з перервами (сайт може бути недоступний).
Інструкція передбачає, що у нас є доступ до веб-сервера Terminal, що працює під управлінням Linux і використовує Apache.
Для Nginx вся теорія застосовується однаково, просто посилання на файл сертифіката відрізняється.
Підключаємося до сервера по SSH.
На 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 налаштовується конкретним хостингом, де ви орендували сервер.
Якщо ви конвертуєте існуючий сайт з http
на https
, вам необхідно гарантувати, що весь трафік буде перенаправлений на новий протокол https
.
У випадку з Apache цього можна легко досягти за допомогою перенаправлення у файлі .htaccess
:
<IfModule mod_rewrite.c>RewriteEngine OnRewriteCond %{HTTPS} !onRewriteRule .? 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
.mc
), який у випадку Ubuntu встановлюється просто командою apt-get install mc
або udo apt-get install mc
.Усередині віртуального хоста потрібно підготувати новий для порту 443
(поширеною проблемою може бути блокування порту 443 на брандмауері).
Вміст файлу може виглядати, наприклад, так:
<IfModule mod_ssl.c><VirtualHost *:443>ServerName baraja.czServerAdmin jan@barasek.comDocumentRoot /var/www/baraja.cz/wwwHeader always set Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"ErrorLog ${APACHE_LOG_DIR}/baraja.cz.ssl.error.logCustomLog ${APACHE_LOG_DIR}/baraja.cz.ssl.access.log combinedSSLEngine onSSLCertificateFile /etc/ssl/baraja.cz/baraja.cz.crtSSLCertificateKeyFile /etc/ssl/baraja.cz/baraja.cz.keySSLCertificateChainFile /etc/ssl/baraja.cz/rapidssl.crtSSLProtocol all -SSLv3SSLCipherSuite 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:!DSSSSLHonorCipherOrder onSSLCompression 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 keepaliveBrowserMatch "MSIE [17-9]" \ssl-unclean-shutdown</VirtualHost></IfModule>
На досьє - найважливіші ділянки:
SSLEngine onSSLCertificateFile /etc/ssl/baraja.cz/baraja.cz.crtSSLCertificateKeyFile /etc/ssl/baraja.cz/baraja.cz.keySSLCertificateChainFile /etc/ssl/baraja.cz/rapidssl.crt
Розуміння цієї конфігурації є абсолютно критичним. Якщо вам потрібно знайти більш детальну інформацію в Google, використовуйте слова SSLCertificateFile
, SSLCertificateKeyFile
та SSLCertificateChainFile
, які є загальними для всіх серверів Apache.
Попередження:** Проблема SSL є відносно старою, і для підтримки зворотної сумісності часто використовуються різні назви для однієї і тієї ж речі! Тому важливо розуміти принцип.
Деталі: Деталі:.
Важливо, що VirualHost містить:
<IfModule mod_ssl.c>
каже, що ми хочемо використовувати SSL<VirtualHost *:443>
, що вся комунікація буде проходити по порту 443SSLEngine 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 файли (які ви називаєте відповідно до вашого домену):
SSLCertificateKeyFile
.Зміст запиту обов'язково має бути поданий на затвердження ОА. Зазвичай це робиться через веб-інтерфейс в адмініструванні на сайті, де продаються сертифікати. Затвердження запиту варіюється в залежності від типу сертифіката. Найчастіше це робиться автоматично роботом і займає від 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:
Články píše Jan Barášek © 2009-2024 | Kontakt | Mapa webu
Status | Aktualizováno: ... | uk