Установка 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 запросит:
- Email для уведомлений о истечении срока действия
- Согласие с условиями обслуживания Let’s Encrypt
- Предложение подписаться на рассылку (можно отказаться)
Ручная установка (альтернативный метод)
Если автоматический метод не работает:
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. Регулярно проверяйте логи и мониторьте состояние сертификатов для поддержания максимальной безопасности.