Поиск по сайту:

Установите Lets Encrypt и защитите Nginx с помощью SSL/TLS в Debian 9


На этой странице

  1. Установите клиентскую утилиту Certbot
  2. Получение сертификата Let’s Encrypt
  3. Альтернативный способ получить SSL-сертификат Lets encrypt
  4. Настройка Nginx для TLS (SSL)
  5. Установите сертификаты Let’s Encrypt в Nginx
  6. Переключить веб-трафик на HTTPS
  7. Окончательные проверки
  8. Автоматическое продление сертификата Let’s Encrypt

В этом руководстве показано, как установить и защитить веб-сервер Nginx в Debian 9 с помощью сертификата TLS, бесплатно выпущенного центром сертификации Let’s Encrypt. Кроме того, мы настроим автоматическое обновление сертификатов Lets Encrypt TLS с помощью задания cron до истечения срока действия сертификатов.

TLS, также известный как Transport Layer Security, представляет собой сетевой протокол, использующий SSL-сертификаты для шифрования сетевого трафика, который проходит между сервером и клиентом или между веб-сервером, таким как сервер Nginx, и браузером. Все данные, которыми обмениваются эти два объекта, защищены, и соединение не может быть расшифровано, даже если оно перехвачено с использованием такой техники, как атака «человек посередине» или перехват пакетов. Программное обеспечение пакета certbot — это официальная клиентская утилита, предоставляемая ЦС Let’s Encrypt, которую можно использовать в процессе создания и загрузки бесплатных сертификатов Let’s Encrypt в Debian.

Требования

  • Установите стек LEMP в Debian 9.
  • Общественное зарегистрированное доменное имя с надлежащими записями DNS (записи A или записи CNAME для субдоменов).
  • Прямой доступ к консоли сервера или удаленный доступ к серверу по SSH.
  • Учетная запись пользователя с привилегиями root или прямым доступом к учетной записи root.

Установите клиентскую утилиту Certbot

Чтобы установить клиентскую утилиту Let’s Encrypt cerbot в Debian 9 из официальных репозиториев Debian, откройте терминал и введите следующую команду с привилегиями root, как показано на следующем снимке экрана.

apt-get install certbot

Утилита Debian apt, представляющая собой интерфейс командной строки основного диспетчера пакетов Debian, после некоторых предварительных проверок спросит вас, согласны ли вы продолжить установку пакета certbot и всех его необходимых зависимостей. Чтобы принять процесс установки программного обеспечения, ответьте «да» (y) в командной строке консоли сервера.

Получить сертификат Let’s Encrypt

Чтобы сгенерировать и загрузить сертификаты Let’s Encrypt для домена, сначала убедитесь, что веб-сервер Nginx запущен и работает, а по крайней мере порт 80 доступен из Интернета. Чтобы проверить, запущен ли Nginx, выполните следующие команды с привилегиями root.

sudo systemctl status nginx

Если сервер еще не запущен, запустите демон Nginx с помощью приведенной ниже команды.

sudo systemctl start nginx

Если в Debian установлен обычный брандмауэр, например брандмауэр UFW, который блокирует все входящие соединения через порты 80 и 443, выполните следующие команды, чтобы открыть порт HTTP и HTTPS в системе.

sudo ufw allow 80/tcp
sudo ufw allow 443/tcp

Чтобы получить сертификаты для вашего домена, выполните команду cerbot в консоли со следующими параметрами и флагами, как описано ниже. Запустите команду с привилегиями root и укажите свое доменное имя и все другие поддомены, для которых вы хотите получить сертификаты, используя флаг –d. Кроме того, укажите параметр --standalone, чтобы certbot не мешал файлам конфигурации Nginx. Сервер Nginx должен быть остановлен во время выдачи сертификатов с использованием этой опции.

Синтаксис команды cerbot:

sudo certbot certonly --standalone –d yourdomain.com –d www.yourdomain.com

При первом запуске команды certbot и получении сертификата вам будет предложено добавить адрес электронной почты и согласиться с условиями обслуживания Let’s Encrypt. Напишите «а», чтобы согласиться с условиями обслуживания; «нет», чтобы не делиться своим адресом электронной почты с партнерами Let’s Encrypt. Наконец, после того, как вы получили сертификат для своего домена, прочитайте примечания в нижнем колонтитуле, чтобы найти системный путь к сертификатам и дату истечения срока их действия.

Альтернативный способ получить SSL-сертификат Lets encrypt

Чтобы получить сертификат Let’s Encrypt через плагин «webroot», используйте приведенный ниже синтаксис. Добавьте корневой веб-каталог Nginx, который по умолчанию находится в системном пути /var/www/html/, при вводе команды certbot с флагами --webroot и –w. Кроме того, убедитесь, что Nginx имеет полные права на запись в корневой веб-каталог, чтобы создать каталог /.well-known.

Опция --webrot для cerbot также попросит вас добавить адрес электронной почты для продления сертификата и уведомлений о безопасности. Клиент Certbot имеет встроенный код, который может обнаруживать поддельный адрес электронной почты. Вы должны предоставить общедоступный адрес электронной почты, чтобы продолжить получение сертификата.

certbot certonly --webroot –w /var/www/html/ -d yourdomain.com –d www.yourdomain.com
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Enter email address (used for urgent renewal and security notices) (Enter 'c' to
cancel):  #A fake email address will be detected
There seem to be problems with that address. Enter email address (used for
urgent renewal and security notices)  If you really want to skip this, you can
run the client with --register-unsafely-without-email but make sure you then
backup your account key from /etc/letsencrypt/accounts   (Enter 'c' to cancel):
 
-------------------------------------------------------------------------------
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.1.1-August-1-2016.pdf. You must agree
in order to register with the ACME server at
https://acme-v01.api.letsencrypt.org/directory
-------------------------------------------------------------------------------
(A)gree/(C)ancel: a
 
-------------------------------------------------------------------------------
Would you be willing to share your email address with the Electronic Frontier
Foundation, a founding partner of the Let's Encrypt project and the non-profit
organization that develops Certbot? We'd like to send you email about EFF and
our work to encrypt the web, protect its users and defend digital rights.
-------------------------------------------------------------------------------
(Y)es/(N)o: n
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for www.domain.com
Using the webroot path /var/www/html/  for all unmatched domains.
Waiting for verification...
Cleaning up challenges
 
IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at
    /etc/letsencrypt/live/www.yourdomain.com/fullchain.pem. Your
   cert will expire on 2017-12-28. To obtain a new or tweaked version
   of this certificate in the future, simply run certbot again. To
   non-interactively renew *all* of your certificates, run "certbot
   renew"
 - Your account credentials have been saved in your Certbot
   configuration directory at /etc/letsencrypt. You should
   make a secure backup of this folder now. This configuration
   directory will also contain certificates and private keys obtained
   by Certbot so making regular backups of this folder is ideal.
 - If you like Certbot, please consider supporting our work by:
 
   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

Настройте Nginx для TLS (SSL)

Полный файл конфигурации TLS Nginx по умолчанию для домена должен выглядеть так, как показано в приведенном ниже фрагменте файла.

Пример файла /etc/nginx/sites-enabled/default-ssl:

    server {
                    listen 443 ssl default_server;
                    listen [::]:443 ssl default_server;
      
                server_name  www.yourdomain.com yourdomain.com;
                #server_name _;
                               
                root /var/www/html;
                               
                access_log /var/log/nginx/access.log;
                error_log /var/log/nginx/error.log;
              
               #SSL Certificates
                ssl_certificate "/etc/letsencrypt/live/www.yourdomain.com/cert.pem";
                ssl_certificate_key "/etc/letsencrypt/live/www. yourdomain.com/privkey.pem";
                ssl_dhparam /etc/nginx/dhparam.pem;
               
                ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
                #ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
 
                ssl_session_cache shared:SSL:1m;
               ssl_session_timeout 10m;
                ssl_ciphers HIGH:!aNULL:!MD5;
                ssl_prefer_server_ciphers  on;
               
                add_header Strict-Transport-Security "max-age=31536000;
    #includeSubDomains" always;
 
                location / {
        index index.php index.html index.htm;
                    try_files $uri $uri/ /index.php?$args $uri/ =404;
                }
 
               
                set $cache_uri $request_uri;
               
                location ~ /.well-known {
                allow all;
                                }
              
                #
                #             # With php-fpm (or other unix sockets):
                                fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
                #             # With php-cgi (or other tcp sockets):
                #             fastcgi_pass 127.0.0.1:9000;
                }

               # deny access to .htaccess files, if Apache's document root
                # concurs with nginx's one
                #
                #location ~ /\.ht {
                #             deny all;
                #}
               
    }

Строки кода для обработки PHP-скриптов через FastCGI Process Manager также можно найти в этом отрывке и представлены следующими строками.

location ~ \.php$ {
                                include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
                }

Установите сертификаты Let’s Encrypt в Nginx

Сертификаты и ключи Let’s Encrypt хранятся в каталоге /etc/letsencrypt/live/www.yourdomain.com/ в Debian. Команда ls для вышеуказанного каталога покажет все компоненты сертификата, такие как файл цепочки, файл полной цепочки, закрытый ключ и файл сертификата.

ls /etc/letsencrypt/live/www.yourdomain.com/

Чтобы установить сертификат Let’s Encrypt в файл конфигурации TLS веб-сервера Nginx, откройте файл Nginx default-ssl и обновите строки ниже, чтобы отразить пути к файлам сертификата Let’s Encrypt для вашего домена, как показано в приведенном ниже фрагменте.

nano /etc/nginx/sites-enabled/default-ssl

Измените следующие строки, как показано ниже:

                ssl_certificate "/etc/letsencrypt/live/www.yourdomain.com/cert.pem ";
                ssl_certificate_key "/etc/letsencrypt/live/www.yourdomain.com /privkey.pem";

Кроме того, если оператор ssl_dhparam присутствует в конфигурации Nginx SSL, вы должны сгенерировать новый 2048-битный ключ Диффи-Хеллмана, выполнив следующую команду. Генерация ключевых параметров Диффи-Хеллмана должна занять некоторое время в зависимости от случайности или энтропии вашей системы.

openssl dhparam –out /etc/nginx/dhparam.pem 2048

Наконец, прежде чем активировать конфигурацию Nginx TLS путем перезапуска демона Nginx для отражения изменений, сначала проверьте конфигурации Nginx на наличие возможных синтаксических ошибок. После этого, если проверка файла конфигурации Nginx прошла успешно, перезапустите демон Nginx, чтобы загрузить новую конфигурацию вместе с сертификатами Let’s Encrypt, выполнив приведенные ниже команды.

nginx -t
service nginx restart

Чтобы проверить, владеет ли служба nginx открытым сокетом в состоянии прослушивания на порту 443, выполните команду netstat, как показано в приведенном ниже отрывке.

netstat –tulpn | grep -e 443 -e LISTEN

Вам также следует открыть браузер и перейти к вашему доменному имени по протоколу HTTPS. Если сертификаты Let’s Encrypt успешно применены в Nginx, рукопожатие SSL должно работать гладко, без каких-либо ошибок.

Перенаправить веб-трафик на HTTPS

Чтобы заставить посетителей вашего домена просматривать ваш веб-сайт только по протоколу HTTPS, откройте файл конфигурации по умолчанию с поддержкой сайтов Nginx и добавьте следующую строку, которая заставляет все запросы, поступающие на порт 80, перенаправляться с кодом состояния 301 (перемещено навсегда) на порт 443.

nano /etc/nginx/sites-enabled/default

Оператор перенаправления должен выглядеть так, как показано в приведенном ниже отрывке.

server_name www.yourdomain.com yourdomain.com;
return         301 https://$server_name$request_uri;

Затем перезапустите демон Nginx, чтобы применить изменения, введя следующую команду.

service nginx restart

Окончательные проверки

Для дальнейшего изучения сертификатов, созданных ЦС Let’s Encrypt, вы можете использовать современный веб-браузер, например Chrome. Зайдите в свой домен из браузера Chrome и нажмите функциональную клавишу F12, чтобы открыть инструменты разработчика. Перейдите на вкладку «Безопасность» и нажмите кнопку «Просмотреть сертификат», чтобы открыть сертификат, как показано на следующих снимках экрана.

Другой полезной утилитой для исследования SSL-сертификатов является утилита командной строки openssl. Чтобы отобразить дополнительную информацию для сертификата ЦС Let’s Encrypt, выполните приведенную ниже команду в консоли Linux.

openssl s_client –connect www.yourdomain.com:443

Автоматическое продление сертификата Let’s Encrypt

Чтобы автоматически обновить сертификат, выданный ЦС Let’s Encrypt до истечения срока действия, запланируйте выполнение задания crontab один раз в день в 2:00, введя следующую команду. Вывод выполненного задания cron будет направлен в файл журнала, хранящийся в /var/log/letsencrypt.log.

crontab –e

Задание Cron для обновления сертификата.

0 2 * * * certbot renew >> /var/log/letsencrypt.log

Вот и все! Для других более сложных конфигураций, касающихся сертификатов и утилиты Let’s Encrypt, посетите официальную документацию по следующему интернет-адресу https://certbot.eff.org/docs/.