https. Let’s Encrypt настраиваем бесплатные сертификаты для nginx

Инфы много, поэтому коротко и тезисно, как получить и обновлять сертификаты Let’s Encrypt и использовать совместно с nginx на Ubuntu.

Читаем тут и тут.

Ставим certbot:

$ sudo apt-get install letsencrypt

Настраиваем домен в nginx.

Создаем файл /etc/nginx/sites-available/test.i-rrv.ssl:

  server {
        listen       192.168.0.1:80;
        server_name  test.i-rrv.ru;

        location /.well-known {
           root         /home/www.test/test;
        }
  }

Папка /home/www.test/test должна уже быть.

Делаем линк:

 ln -s /etc/nginx/sites-available/test.i-rrv.ssl /etc/nginx/sites-enabled/test.i-rrv.ssl

Перезапускаем nginx

$ sudo service nginx restart

Создаем сертификаты:

$ sudo letsencrypt certonly --webroot -w /home/www.test/test -d test.i-rrv.ru

за раз можно сделать для нескольких доменов, но нам не надо.

Отвечаем за вопросы.

Все, сертификаты созданы, теперь меняем настройку домена, включаем поддержку ssl (тут пример, у вас будет свой):

   server {
        listen       192.168.0.1:80;
        server_name  test.i-rrv.ru;
        charset utf-8;
        location /.well-known {
        root         /home/www.test/test;
        }
        location / {                                                                                                                                                          
          return 301 https://$server_name$request_uri;  # enforce https                                                                                                         
        } 
    }
    server {
        listen          10.157.35.2:443;
        server_name test.i-rrv.ru;
        ssl on;
        ssl_certificate /etc/letsencrypt/live/test.i-rrv.ru/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/test.i-rrv.ru/privkey.pem;
        error_log /home/www.test/nginx_ssl_test.i-rrv_error.log;
        location / {
            root                  /home/www.test/test/;
            charset utf-8;
        }
location ~* \.php$ {
            root                  /home/www.test/test/;
            fastcgi_pass    unix:/run/php/php7.0-fpm.sock;
            fastcgi_index index.php;
            fastcgi_param   SCRIPT_FILENAME     $document_root$fastcgi_script_name;
            fastcgi_param   PATH_INFO           $fastcgi_script_name;
            fastcgi_param   SERVER_PROTOCOL     $server_protocol;
            fastcgi_param   QUERY_STRING        $query_string;
            fastcgi_param   REQUEST_METHOD      $request_method;
            fastcgi_param   CONTENT_TYPE        $content_type;
            fastcgi_param   CONTENT_LENGTH      $content_length;
            fastcgi_param   SERVER_ADDR         $server_addr;
            fastcgi_param   SERVER_PORT         $server_port;
            fastcgi_param   SERVER_NAME         $server_name;
            fastcgi_param   HTTPS   on;
            fastcgi_param HTTP_SCHEME https;
            client_body_temp_path /home/www.test/sy_client_temp/;
}
    location ~* \.(jpg|jpeg|gif|png|swf|ico|js|css)$ {
        root         /home/www.test/test/;
        access_log   off;
        expires      30d;
    }
    location ~ /\.ht {
        deny  all;
    }
}

Перезапускаем nginx
$ sudo service nginx restart

Проверяем работу.

Осталось только добавить добавить в cron задачу автоматического пересоздания сертификатов, т.к. они действуют только 90 дней.

Добавляем строку в файл /etc/crontab:

27 0,12 * * *   root    /usr/bin/letsencrypt renew --dry-run --agree-tos > /dev/null 2>>/var/log/letsencrypt/cron-letsencrypt.log

Время выбираем по вкусу, но разработчики certbot рекомендуют два раза в сутки, но учтите, что он не надолго останавливает работу сервера, так что если вам это критично, обновляйте в ручную.
Перезапускаем cron:

$ sudo killall -1 cron

Все 😉

Leave a Reply