Пост

Установка SSL-сертификата на Nginx на Raspberry Pi

Установка SSL-сертификатов на веб-сервер Nginx в Raspberry Pi OS обеспечивает безопасное HTTPS-соединение для ваших веб-проектов. Это особенно важно при использовании Raspberry Pi в качестве веб-сервера для личных проектов, портфолио или небольших приложений.

Установка SSL-сертификата на Nginx на Raspberry Pi

Введение

Установка SSL-сертификатов на веб-сервер Nginx в Raspberry Pi OS обеспечивает безопасное HTTPS-соединение для ваших веб-проектов. Это особенно важно при использовании Raspberry Pi в качестве веб-сервера для личных проектов, портфолио или небольших приложений.

Предварительные требования

  • Raspberry Pi с установленной Raspberry Pi OS (последней версии)
  • Установленный и настроенный Nginx
  • Статический IP-адрес или настроенный динамический DNS
  • Зарегистрированное доменное имя
  • Права суперпользователя (sudo)

Обновление системы

Перед установкой обновите систему:

1
2
sudo apt update
sudo apt upgrade -y

Установка Certbot для Raspberry Pi OS

Certbot — рекомендуемый инструмент для получения бесплатных SSL-сертификатов Let’s Encrypt.

Установка Certbot и плагина для Nginx:

1
sudo apt install certbot python3-certbot-nginx -y

Проверка установки:

1
certbot --version

Подготовка Nginx к установке SSL

Настройка домена в Nginx

Убедитесь, что у вас есть настроенный виртуальный хост. Пример конфигурации в /etc/nginx/sites-available/your_domain:

1
2
3
4
5
6
7
8
9
10
11
server {
    listen 80;
    listen [::]:80;
    server_name your_domain.com www.your_domain.com;
    root /var/www/your_domain/html;
    index index.html index.htm;
    
    location / {
        try_files $uri $uri/ =404;
    }
}

Активируйте конфигурацию:

1
2
3
sudo ln -s /etc/nginx/sites-available/your_domain /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

Получение SSL-сертификата с помощью Certbot

Автоматическая установка

Самый простой способ получения и настройки SSL:

1
sudo certbot --nginx -d your_domain.com -d www.your_domain.com

Во время установки Certbot запросит:

  1. Email для уведомлений о истечении срока действия
  2. Согласие с условиями обслуживания Let’s Encrypt
  3. Предложение подписаться на рассылку (можно отказаться)

Ручная установка (альтернативный метод)

Если автоматический метод не работает:

1
sudo certbot certonly --nginx -d your_domain.com

Проверка работы SSL

После установки проверьте:

1
curl -I https://your_domain.com

Или откройте сайт в браузере и проверьте наличие замка в адресной строке.

Настройка автоматического обновления сертификатов

Let’s Encrypt сертификаты действительны 90 дней. Certbot автоматически добавляет задание в cron.

Проверка тестового обновления:

1
sudo certbot renew --dry-run

Ручная проверка задания cron:

1
sudo crontab -l

Расширенные настройки SSL для Nginx

Оптимизированная конфигурация SSL

Добавьте в конфигурацию Nginx после получения сертификата:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512;
ssl_prefer_server_ciphers off;

ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;
ssl_session_tickets off;

ssl_stapling on;
ssl_stapling_verify on;

add_header Strict-Transport-Security "max-age=63072000" always;
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;

Полная конфигурация виртуального хоста с SSL

Пример полной конфигурации в /etc/nginx/sites-available/your_domain:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# HTTP to HTTPS redirect
server {
    listen 80;
    listen [::]:80;
    server_name your_domain.com www.your_domain.com;
    return 301 https://$server_name$request_uri;
}

# HTTPS server
server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name your_domain.com www.your_domain.com;

    # SSL certificates (автоматически настроены Certbot)
    ssl_certificate /etc/letsencrypt/live/your_domain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/your_domain.com/privkey.pem;
    
    # SSL optimization
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers off;
    
    root /var/www/your_domain/html;
    index index.html index.htm;
    
    location / {
        try_files $uri $uri/ =404;
    }
    
    # Security headers
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
    add_header X-Content-Type-Options nosniff;
    add_header X-Frame-Options DENY;
    add_header X-XSS-Protection "1; mode=block";
}

Управление сертификатами

Просмотр информации о сертификатах:

1
sudo certbot certificates

Обновление сертификата вручную:

1
sudo certbot renew --force-renewal

Отзыв сертификата:

1
sudo certbot revoke --cert-name your_domain.com

Удаление конфигурации:

1
sudo certbot delete --cert-name your_domain.com

Настройка мониторинга срока действия

Скрипт для проверки срока действия:

Создайте скрипт для мониторинга:

1
sudo nano /usr/local/bin/check-ssl-expiry.sh
1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash
DOMAIN="your_domain.com"
EXPIRY_DATE=$(openssl x509 -enddate -noout -in /etc/letsencrypt/live/$DOMAIN/cert.pem | cut -d= -f2)
EXPIRY_TS=$(date -d "$EXPIRY_DATE" +%s)
CURRENT_TS=$(date +%s)
DAYS_LEFT=$(( (EXPIRY_TS - CURRENT_TS) / 86400 ))

if [ $DAYS_LEFT -lt 30 ]; then
    echo "Внимание: Сертификат для $DOMAIN истекает через $DAYS_LEFT дней"
    # Добавьте здесь отправку уведомления
fi

Сделайте скрипт исполняемым:

1
sudo chmod +x /usr/local/bin/check-ssl-expiry.sh

Добавьте в cron для ежедневной проверки:

1
(crontab -l ; echo "0 9 * * * /usr/local/bin/check-ssl-expiry.sh") | crontab -

Типичные проблемы и решения

Проблема: Ошибка “Could not bind to IPv4 or IPv6.”

  • Решение: Убедитесь, что порты 80 и 443 свободны, остановите другие веб-серверы
    1
    2
    
    sudo netstat -tulpn | grep :80
    sudo netstat -tulpn | grep :443
    

Проблема: Ошибка проверки домена

  • Решение: Проверьте, что домен указывает на IP-адрес вашего Raspberry Pi
    1
    
    dig your_domain.com
    

Проблема: Nginx не перезагружается после получения сертификата

  • Решение: Перезагрузите Nginx вручную
    1
    
    sudo systemctl reload nginx
    

Проблема: Смешанное содержимое (Mixed Content)

  • Решение: Обновите все ссылки в HTML/CSS/JS файлах с HTTP на HTTPS
  • Используйте относительные пути (// вместо http:// или https://)

Проблема: Низкая производительность SSL

  • Решение: Включите кэширование сессий и используйте современные протоколы
  • Для Raspberry Pi рекомендуется использовать TLS 1.2/1.3 с легковесными шифрами

Оптимизация для Raspberry Pi

Настройка параметров SSL для оптимальной производительности:

1
2
3
ssl_session_cache shared:SSL:5m;
ssl_session_timeout 1h;
ssl_buffer_size 4k;

Использование аппаратного ускорения (для Raspberry Pi 4):

1
sudo nano /etc/nginx/nginx.conf

Добавьте в блок http:

1
ssl_engine dynamic_engine;

Резервное копирование сертификатов

Создайте скрипт для резервного копирования:

1
sudo nano /usr/local/bin/backup-ssl.sh
1
2
3
4
5
#!/bin/bash
BACKUP_DIR="/home/pi/ssl-backups"
mkdir -p $BACKUP_DIR
tar -czf "$BACKUP_DIR/letsencrypt-$(date +%Y%m%d).tar.gz" /etc/letsencrypt/
echo "Backup создан в $BACKUP_DIR/"

Безопасность конфигурации

Защита приватных ключей:

1
2
sudo chmod 600 /etc/letsencrypt/live/your_domain.com/privkey.pem
sudo chmod 700 /etc/letsencrypt/live/your_domain.com

Регулярное обновление:

Добавьте в cron ежедневное обновление системы и проверку сертификатов:

1
2
(crontab -l ; echo "0 3 * * * sudo apt update && sudo apt upgrade -y") | crontab -
(crontab -l ; echo "0 4 * * * sudo certbot renew --quiet --post-hook \"systemctl reload nginx\"") | crontab -

Теперь ваш веб-сервер Nginx на Raspberry Pi защищен SSL-сертификатом от Let’s Encrypt. Система автоматически обновляет сертификаты каждые 90 дней, обеспечивая непрерывную безопасную работу вашего сайта по протоколу HTTPS. Регулярно проверяйте логи и мониторьте состояние сертификатов для поддержания максимальной безопасности.

Авторский пост защищен лицензией CC BY 4.0 .

© evdokimoff. Некоторые права защищены.

Использует тему Chirpy для Jekyll