Настройка Nginx + SSL от Let’s Encrypt на Debian

15-Мар-19 10:13

Настройка Nginx + SSL от Let’s Encrypt на Debian

Крупные поисковые системы рекомендуют использовать защищённый https протокол. По некоторой информации наличие SSL положительно влияет на ранжирование.

    Мы будем использовать:
  • Операционная система Debian
  • Веб-сервер Nginx
  • Бесплатный сертификат Let’s Encrypt, выдаётся на 3 месяца, поэтому нужно не забывать обновлять.

Приступим

  1. Подключаемся через SSH и скачиваем репозиторий Let’s Encrypt
    git clone https://github.com/letsencrypt/letsencrypt /opt/letsencrypt
    
  2. Подключать сертификаты будем с помощью Webroot. Для этого открываем файл настроек виртуального хоста (например, /etc/nginx/conf.d/domain.conf или /etc/nginx/sites-available/domain.conf) и в блок server добавляем следующие строки:
    location ~ /.well-known {
    	allow all;
    }
    
    Сохраняем и проверяем конфиг
    nginx -t
    Если сделали всё правильно увидите следующее
    nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
    nginx: configuration file /etc/nginx/nginx.conf test is successful
    Перезагружаем конфиг
    service nginx reload
  3. Далее создаем сертификат с помощью клиента Let’s Encrypt: Переходим в папку
    cd /opt/letsencrypt
    Запускаем команду:
    ./letsencrypt-auto certonly -a webroot --webroot-path=/var/www/domain --email webmaster@example.com -d domain.com -d www.domain.com
    • webroot-path - заменить на ваш путь к каталогу где находится сайт;
    • email - ваш действующий почтовый ящик;
    • d - ваш домен;
    Если вы сделали все правильно появится примерно следующий текст:
    IMPORTANT NOTES:
     - Congratulations! Your certificate and chain have been saved at
       /etc/letsencrypt/live/domain .com/fullchain.pem. Your cert will
       expire on 2016-07-19. To obtain a new version of the certificate in
       the future, simply run Let's Encrypt again.
     - If you like Let's Encrypt, please consider supporting our work by:
    
       Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
       Donating to EFF:                    https://eff.org/donate-le
    Генерируем ключ Diffie–Hellman:
    mkdir /etc/nginx/ssl && openssl dhparam -out /etc/nginx/ssl/domain.pem 2048

    Вместо domain.pem рекомендую указывать название вашего домена (например: web-tool.pem), чтоб в дальнейшем не возникало путаницы.
    Данная операция может занять несколько минут.
    DH ключи будут помещены в каталог /etc/nginx/ssl/.

  4. Возвращаемся в редактированию виртуального хоста Nginx (например, /etc/nginx/conf.d/domain.conf или /etc/nginx/sites-available/domain.conf) блок server приводим примерно к следующие строки:
    server {
        listen 80;
        listen 443 ssl;
        server_name domain.com www.domain.com; # ваш домен
        root /var/www/example; # путь до вашего каталога
        if ( $scheme = "http" ) {
            return 301 https://$host$request_uri;
        }
        ssl_certificate /etc/letsencrypt/live/domain.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/domain.com/privkey.pem;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;
        ssl_dhparam /etc/nginx/ssl/domain.pem;
        ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:ECDHE-RSA-AES128-GCM-SHA256:AES256+EECDH:DHE-RSA-AES128-GCM-SHA256:AES256+EDH:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4";
        ssl_session_timeout 1d;
        ssl_session_cache shared:SSL:50m;
        ssl_stapling on;
        ssl_stapling_verify on;
        add_header Strict-Transport-Security max-age=15768000;
        charset utf-8;
    
        # Lets Encrypt Webroot
        location ~ /.well-known {
            allow all;
        }
    
        location / {
    	index index.php index.html;
    	try_files $uri $uri/ /index.php?$query_string;
        }
    
    ... # ваши настройки
     }
      Важно!!! То что подчеркнуто заменить на свои данные.
    • ssl_certificate /etc/letsencrypt/live/domain.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/domain.com/privkey.pem;
    • /etc/nginx/ssl/domain.pem;
    Проверяем
    nginx -t
    Если все сделали правильно увидите
    nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
    nginx: configuration file /etc/nginx/nginx.conf test is successful
    Перезагружаем nginx
    service nginx restart
  5. Проверяем здесь.
  6. Обновление сертификата происходит следующей командой (сейчас не требуется, мы получили новый сертификат)
    /opt/letsencrypt/letsencrypt-auto renew
  7. Для автоматического обновления сертификата, создаем крон задачу.
    Запускаем редактирование crontab
    crontab -e
    Добавляем
    @monthly /opt/letsencrypt/letsencrypt-auto renew >> /var/log/le-renew.log
    @monthly service nginx restart