Thank you for reading this post, don't forget to subscribe!
Генерация сертификатов и настройка авто обновлений
Создаем каталог для certbot и скачиваем его:
cd / && mkdir downloads && cd /downloads
wget https://dl.eff.org/certbot-auto && chmod a+x certbot-auto
Далее, генерируем и настраиваем сертификат:
./certbot-auto certonly --webroot --webroot-path /var/www/domain.com --renew-by-default --email email@domain.com --text --agree-tos -d domain.com -d www.domain.com
Описание параметров:
- webroot — метод генерации и подключения сертификата. Этот метод необходимо указать только в том случае, если Ваш DNS-провайдер контролирует доступ к ресурсу по определённым протоколам (как, например, CloudFlare мониторит активность SSL);
- webroot-path — директория, в которой расположены файлы сайта/домена;
- renew-by-default — опция для автоматического обновления сертификата;
- email — Ваш e-mail, нужен для получения данных о состоянии сертификата;
- text — вывод информации о процессе генерации в текстовом виде;
- agree-tos — опция согласия с Terms of Service;
- d — (domain) домен, к которому можно применить сертификат. Можно указать несколько.
После генерации, в случае успеха, получаем следующее сообщение
IMPORTANT NOTES: — Congratulations!
Your certificate and chain have been saved at /etc/letsencrypt/live/myhost.tld/fullchain.pem.
Your cert will expire on 2020-01-01.
To obtain a new version of the certificate in the future, simply run Let’s Encrypt again.
Это значит, что ключ и сертификат сгенерировались успешно, и теперь лежат по адресу
ls -la /etc/letsencrypt/live/domain.com/
Конфигурация VirtualHost и 301 редирект для домена с http на https в apache (debian)
Теперь приступим к настройке Apache. Обязательно делаем бекап рабочего конфига и приступаем к редактирования:
1
2
3
|
cd /etc/apache2/sites-available/
sudo cp domain.com.conf domain.com.conf_backup
sudo nano domain.com.conf
|
Здесь, в самом верху файла, добавляем новую директиву VirtualHost со следующим содержимым:
1
2
3
4
|
<VirtualHost *:80>
ServerName domain.com
Redirect "/" "https://domain.com/"
</VirtualHost>
|
Данная настройка будет автоматически перенаправлять всех входящих на версию сайта с SSL.
В основном VirtualHost меняем порт на 443:
1
2
|
<VirtualHost *:443>
...
|
Ниже вписываем конфигурацию SSL:
1
2
3
4
5
|
SSLEngine On
SSLProtocol all -SSLv2
SSLCertificateFile /etc/letsencrypt/live/domain.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/domain.com/privkey.pem
|
Описание переменных:
- SSLEngine On — включение механизма шифрования;
- SSLProtocol all -SSLv2 — разрешение использовать только SSLv2, т.к. v1 уже не является стойким;
- SSLCertificateFile — путь к файлу сертификата (*.crt);
- SSLCertificateKeyFile — путь к файлу ключа (*.rsa).
После всех изменений — перезагружаем Apache, предварительно включив mod_ssl и проверив конфиг на корректность синтаксиса:
1
2
3
|
sudo a2enmod ssl
sudo apache2ctl configtest
sudo service apache2 restart
|
Проверяем. Если всё сделано правильно — в адресной строке, рядом с именем сайта, должен быть зелёный замок.
Настройка TLS/SSL на web сервере — nginx
Сгенерируем Diffie-Hellman ключ
sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
Добавим сертификаты в конфиг
sudo nano /etc/nginx/snippets/ssl-domain.com.conf
ssl_certificate /etc/letsencrypt/live/domain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/domain.com/privkey.pem;
Создадим второй файл с параметрами для настроек SSL
sudo nano /etc/nginx/snippets/ssl-params.conf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH"; ssl_ecdh_curve secp384r1; ssl_session_cache shared:SSL:10m; ssl_session_tickets off; ssl_stapling on; ssl_stapling_verify on; resolver 8.8.8.8 8.8.4.4 valid=300s; resolver_timeout 5s; add_header Strict-Transport-Security "max-age=63072000; includeSubdomains"; add_header X-Frame-Options DENY; add_header X-Content-Type-Options nosniff; ssl_dhparam /etc/ssl/certs/dhparam.pem; |
Сделайте резервную копиюконфига вашего виртуального хоста в который будем добаввлять ssl
sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/default.bak
Редактируем его
sudo nano /etc/nginx/sites-available/default
Я предлагаю конфигурацию nginx с реврайтами http на https и www на без www (nginx redirects. http to https and www to non-www)
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 |
server { listen 80; server_name domain.com www.domain.com; rewrite ^/(.*) https://domain.com/$1 permanent; } server { listen 443 ssl; server_name www.domain.com; include snippets/ssl-domain.com.conf; include snippets/ssl-params.conf; rewrite ^/(.*) https://domain.com/$1 permanent; } server { listen 443 ssl; server_name domain.com; root /var/www/domain.com; access_log /var/log/nginx/domain.com-access.log; error_log /var/log/nginx/domain.com-error.log; index index.html index.htm index.php; include snippets/ssl-domain.com.conf; include snippets/ssl-params.conf; ... } |
Убеждаемся, что все ок и перезагружаем nginx
1
2
|
nginx -t
service nginx restart
|
Обновление сертификата
1
|
./certbot-auto renew --dry-run
|
Также возможно добавить в cron
Можно запустить обновление ипроверить требуется или нет в текущий момент обновление сертификата
1
2
|
cd /downloads
sudo certbot renew
|
Вывод
1
2
3
4
5
6
7
8
9
10
|
Saving debug log to /var/log/letsencrypt/domain.com.log
-------------------------------------------------------------------------------
Processing /etc/letsencrypt/renewal/domain.com.conf
-------------------------------------------------------------------------------
Cert not yet due for renewal
The following certs are not due for renewal yet:
/etc/letsencrypt/live/domain.com/fullchain.pem (skipped)
No renewals were attempted.
|
Добавим в cron обновление letsencrypt сертификатов
1
|
sudo crontab -e
|
1
|
30 2 * * * /usr/bin/certbot renew --noninteractive --renew-hook "/bin/systemctl reload nginx" >> /var/log/le-renew.log
|
Дополнительно.
Сопоставление дефолтного конфига апача с названием файлов сертификатов, генерируемых летсэнкриптом:
1
2
3
|
domain.com.crt -> /etc/ssl/certs/ssl-cert-snakeoil.pem-> SSLCertificateFile-> cert.pem
domain.com.key-> /etc/ssl/private/ssl-cert-snakeoil.key -> SSLCertificateKeyFile -> privkey.pem
domain.com.bundle-> /etc/apache2/ssl.crt/server-ca.crt-> SSLCertificateChainFile -> fullchain.pem
|