Генерация сертификатов и настройка авто обновлений
Создаем каталог для certbot и скачиваем его:
| 
					 1 2  | 
						cd / && mkdir downloads && cd /downloads wget https://dl.eff.org/certbot-auto && chmod a+x certbot-auto  | 
					
Далее, генерируем и настраиваем сертификат:
| 
					 1  | 
						./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) домен, к которому можно применить сертификат. Можно указать несколько.
 
После генерации, в случае успеха, получаем следующее сообщение:
| 
					 1 2 3 4  | 
						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.  | 
					
Это значит, что ключ и сертификат сгенерировались успешно, и теперь лежат по адресу
| 
					 1  | 
						ls -la /etc/letsencrypt/live/domain.com/  | 
					
Конфигурация VirtualHost и 301 редирект для домена с http на https в apache
Теперь приступим к настройке 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 ключ
| 
					 1  | 
						sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048  | 
					
Добавим сертификаты в конфиг
| 
					 1 2 3 4  | 
						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
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17  | 
						sudo nano /etc/nginx/snippets/ssl-params.conf 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
| 
					 1  | 
						sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/default.bak  | 
					
Редактируем его
| 
					 1  | 
						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  | 
					
