Представь, что твой сайт работает по HTTP — это как отправлять открытую почтовую открытку через интернет. Любой может прочитать содержимое. SSL/TLS шифрует эту "открытку", превращая её в защищённый конверт. В этой статье я, как Senior DevOps, покажу тебе все этапы установки SSL на Ubuntu — от базовых понятий до продвинутых настроек.
Что такое SSL и зачем он нужен?
SSL (Secure Sockets Layer) и его преемник TLS (Transport Layer Security) — это криптографические протоколы, которые обеспечивают безопасную передачу данных между клиентом и сервером. Основные преимущества:
- Шифрование данных — защита от перехвата информации
- Аутентификация — подтверждение подлинности сервера
- Целостность данных — гарантия, что данные не были изменены
- SEO-преимущества — Google ранжирует HTTPS-сайты выше
- Доверие пользователей — браузер показывает "безопасное соединение"
Подготовка Ubuntu сервера к установке SSL
Перед тем как начать установку SSL на Ubuntu, убедись, что у тебя есть:
- Ubuntu 20.04 LTS или новее (рекомендуется 22.04 LTS)
- Установленный и настроенный веб-сервер (Apache или Nginx)
- Доменное имя, указывающее на IP-адрес твоего сервера
- Открытые порты 80 (HTTP) и 443 (HTTPS) в firewall
Обновление системы и установка зависимостей
Давай начнём с базовой подготовки системы:
# Обновляем пакеты системы
sudo apt update
sudo apt upgrade -y
# Устанавливаем необходимые утилиты
sudo apt install -y curl wget git nano
# Проверяем версию Ubuntu
lsb_release -a
Установка SSL сертификата Let's Encrypt на Ubuntu
Let's Encrypt — это бесплатный, автоматизированный и открытый центр сертификации. Идеальное решение для большинства проектов. Мы будем использовать Certbot — официальный клиент Let's Encrypt.
Установка Certbot
# Добавляем репозиторий Certbot
sudo apt install -y software-properties-common
sudo add-apt-repository -y ppa:certbot/certbot
sudo apt update
# Устанавливаем Certbot
sudo apt install -y certbot python3-certbot-apache # Для Apache
# ИЛИ
sudo apt install -y certbot python3-certbot-nginx # Для Nginx
Получение SSL сертификата
Теперь получим сертификат для твоего домена. Замени example.com на свой домен:
# Для Apache
sudo certbot --apache -d example.com -d www.example.com
# Для Nginx
sudo certbot --nginx -d example.com -d www.example.com
Certbot задаст несколько вопросов:
- Email для уведомлений о истечении срока
- Согласие с условиями обслуживания
- Предпочтение по redirect с HTTP на HTTPS (рекомендуется выбрать вариант 2)
Ручная установка SSL на Ubuntu (без Certbot)
Иногда нужен больший контроль. Давай разберем ручной метод установки SSL на Ubuntu:
Создание директории для сертификатов
sudo mkdir -p /etc/ssl/example.com
sudo chmod 700 /etc/ssl/example.com
Размещение сертификатов
Помести свои сертификаты (полученные от хостинга или CA) в созданную директорию:
# Обычно у тебя будет три файла:
# 1. example.com.crt - основной сертификат
# 2. example.com.key - приватный ключ
# 3. ca_bundle.crt - цепочка доверия (интермедиат)
# Копируем файлы
sudo cp example.com.crt /etc/ssl/example.com/
sudo cp example.com.key /etc/ssl/example.com/
sudo cp ca_bundle.crt /etc/ssl/example.com/
# Устанавливаем правильные права
sudo chmod 600 /etc/ssl/example.com/example.com.key
Настройка веб-серверов для работы с SSL
Настройка Apache для SSL на Ubuntu
Создадим или отредактируем конфигурационный файл:
sudo nano /etc/apache2/sites-available/example.com-ssl.conf
<VirtualHost *:443>
ServerName example.com
ServerAlias www.example.com
DocumentRoot /var/www/example.com/public_html
SSLEngine on
SSLCertificateFile /etc/ssl/example.com/example.com.crt
SSLCertificateKeyFile /etc/ssl/example.com/example.com.key
SSLCertificateChainFile /etc/ssl/example.com/ca_bundle.crt
# Настройки безопасности
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256
SSLHonorCipherOrder on
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
ErrorLog ${APACHE_LOG_DIR}/example.com_error.log
CustomLog ${APACHE_LOG_DIR}/example.com_access.log combined
</VirtualHost>
# Активируем SSL модуль и сайт
sudo a2enmod ssl
sudo a2ensite example.com-ssl.conf
# Перезапускаем Apache
sudo systemctl restart apache2
Настройка Nginx для SSL на Ubuntu
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name example.com www.example.com;
ssl_certificate /etc/ssl/example.com/example.com.crt;
ssl_certificate_key /etc/ssl/example.com/example.com.key;
ssl_trusted_certificate /etc/ssl/example.com/ca_bundle.crt;
# Modern SSL configuration
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
ssl_prefer_server_ciphers off;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;
# HSTS
add_header Strict-Transport-Security "max-age=63072000" always;
root /var/www/example.com/html;
index index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
}
# Проверяем конфигурацию Nginx
sudo nginx -t
# Перезагружаем Nginx
sudo systemctl reload nginx
Автоматическое обновление SSL сертификатов
Сертификаты Let's Encrypt действительны 90 дней. Настроим автоматическое обновление:
# Тестируем автоматическое обновление
sudo certbot renew --dry-run
# Добавляем задание в cron
sudo crontab -e
Добавь в конец файла crontab:
# Обновление SSL сертификатов каждый день в 3:00
0 3 * * * /usr/bin/certbot renew --quiet --post-hook "systemctl reload nginx"
# Или для Apache:
# 0 3 * * * /usr/bin/certbot renew --quiet --post-hook "systemctl reload apache2"
Проверка установки SSL на Ubuntu
Убедимся, что всё работает правильно:
# Проверяем SSL соединение
openssl s_client -connect example.com:443 -servername example.com
# Проверяем цепочку сертификатов
curl -I https://example.com
# Используем онлайн-инструменты:
# 1. SSL Labs (https://www.ssllabs.com/ssltest/)
# 2. Why No Padlock? (https://www.whynopadlock.com/)
# 3. SSL Checker (https://www.sslshopper.com/ssl-checker.html)
Сравнение методов установки SSL на Ubuntu
| Метод | Сложность | Стоимость | Автообновление | Лучше для |
|---|---|---|---|---|
| Let's Encrypt (Certbot) | Низкая | Бесплатно | Да | Стартапы, блоги, тестовые среды |
| Ручная установка | Высокая | Зависит от CA | Нет | Корпоративные проекты, EV сертификаты |
| Панели управления (cPanel, Plesk) | Очень низкая | Бесплатно/Платно | Зависит от панели | Хостинг-провайдеры, shared hosting |
Частые проблемы и их решение
Решение: Проверь, что сервер слушает порт 443 и SSL конфигурация корректна
Решение: Убедись, что цепочка доверия (CA bundle) правильно указана в конфигурации
Решение: Обнови сертификат:
sudo certbot renew
Часто задаваемые вопросы (FAQ)
Как проверить срок действия SSL сертификата на Ubuntu?
Используй команду: echo | openssl s_client -connect example.com:443 2>/dev/null | openssl x509 -noout -dates. Это покажет даты начала и окончания действия сертификата.
Можно ли использовать один SSL сертификат для нескольких доменов?
Да, для этого нужен Wildcard или Multi-Domain (SAN) сертификат. Let's Encrypt поддерживает Wildcard сертификаты: sudo certbot certonly --manual -d \"*.example.com\" -d example.com
Как перенести SSL сертификат на другой сервер Ubuntu?
Скопируй три файла: приватный ключ (.key), основной сертификат (.crt) и цепочку доверия (.ca-bundle). Никогда не передавай приватный ключ по незащищенным каналам.
Что делать, если Certbot не может пройти верификацию домена?
1. Проверь DNS записи (A/AAAA) домена. 2. Убедись, что порт 80 открыт. 3. Используй DNS-верификацию: sudo certbot certonly --manual --preferred-challenges dns -d example.com
Заключение
Установка SSL на Ubuntu — критически важный этап развертывания любого веб-проекта. Мы рассмотрели два основных подхода: автоматический с Let's Encrypt/Certbot (идеально для большинства случаев) и ручной (для специфических требований).
Ключевые шаги, которые ты должен запомнить:
- Подготовь сервер (обновления, зависимости)
- Выбери метод получения сертификата
- Настрой веб-сервер (Apache/Nginx)
- Настрой автоматическое обновление
- Протестируй и мониторь
SSL больше не опция — это обязательное требование для современного веба. Потрать время на правильную настройку один раз, и твой сайт будет безопасным, доверенным и SEO-оптимизированным на долгое время.