пятница, 13 июля 2018 г.

Создание бесплатного TLS сертификата для сайта

С развитием сайта и в случае, если сайт предоставляет сервисы для клиентов, появляется необходимость обеспечения безопасного соединения клиентов с сайтом. Поэтому многие сайты переходят с протокола HTTP на HTTPS.
Для работы HTTPS версии сайта требуются TLS (SSL) сертификаты. Раньше сертификаты нужно было покупать в специализированных центрах сертификации, но c появлением технологии Let’s Encrypt, сертификаты теперь можно получить бесплатно.
Расскажем как можно получить такой сертификат, а также как настроить автоматическое продление TLS сертификата, ведь срок действия letsencrypt-сертификата составляет всего 3 месяца.

Перед началом убеждаемся, что у нас установлены python и git.

Затем нужно настроить web-сервер для того, чтобы он смог обработать запрос на подтверждение подлинности сайта, т.е. что сертификат запросил именно владелец сайта, а не кто-то другой. Для этого в конфигурационный файл сайта в nginx добавляем такой location:
location /.well-known/ {
  root /var/www/html;
}
И перезагружаем nginx:
service nginx reload
А для apache такие настройки:
Alias /.well-known /var/www/html/.well-known
<Directory "/var/www/html">
 Require all granted
 RewriteEngine off
</Directory>
И перезагружаем apache:
service apache2 reload

Далее скачиваем специализированное ПО для получения сертификата, называемое certbot:
cd /root
git clone https://github.com/certbot/certbot
Теперь всё готово, сертификат получаем такой командой:
cd /root/certbot/
./certbot-auto certonly --webroot -w /var/www/html -d <ваш_домен> -d www.<ваш_домен>
Certbot сохранит сделанные сертификаты в папке /etc/letsencrypt/live/<ваш_домен>/

Теперь настраиваем web-сервер для работы сайта по HTTPS. Для nginx настройки могут быть такие:
server {
  listen 443 ssl http2;
  server_name <ваш_домен> www.<ваш_домен>;

  ssl on;
  ssl_certificate /etc/letsencrypt/live/<ваш_домен>/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/<ваш_домен>/privkey.pem;

  error_log /var/log/nginx/<ваш_домен>-errors.log;
  access_log /var/log/nginx/<ваш_домен>-access.log;

  location /.well-known/ {
    root /var/www/html;
  }

  location / {
    root /var/www/<ваш_домен>;
  }
}
Для apache:
<VirtualHost *:443>
 DocumentRoot /var/www/<ваш_домен>
 ServerName <ваш_домен>
 ServerAlias www.<ваш_домен>

 ErrorLog /var/log/apache2/<ваш_домен>-error.log
 CustomLog /var/log/apache2/<ваш_домен>-access.log common

 SSLEngine on
 SSLCertificateFile /etc/letsencrypt/live/<ваш_домен>/fullchain.pem
 SSLCertificateKeyFile /etc/letsencrypt/live/<ваш_домен>/privkey.pem

 Alias /.well-known /var/www/html/.well-known
 <Directory "/var/www/html">
   Require all granted
   RewriteEngine off
 </Directory>

 <Directory "/var/www/<ваш_домен>">
   Require all granted
 </Directory>
</VirtualHost>
Перезагружаем web-сервер для применения настроек.
Чтобы по истечении срока годности сертификата сertbot продлил его автоматически, добавляем в /etc/crontab строки:
# Update all TLS certs
22 13 * * * root /root/certbot/certbot-auto renew -q --no-self-upgrade --post-hook 'service nginx restart'
Или, в случае с apache:
# Update all TLS certs
22 13 * * * root /root/certbot/certbot-auto renew -q --no-self-upgrade --post-hook 'service apache2 restart'

Теперь все готово, можно пользоваться https версией сайта!