Nginx-ке SSL орнату
Бұл мақалада Ubuntu операциялық жүйесіндегі Nginx үшін SSL сертификатын орнату процесін қарастырамыз. Nginx тиісті мақалада сипатталғандай орнатылып, бапталған деп есептеледі.
Let's Encrypt шығару және орнату
1-қадам. Certbot орнату
SSL сертификатын алу үшін Certbot-ты пайдаланамыз. Оны серверге орнатайық:
sudo apt install certbot python3-certbot-nginx
2-қадам. Nginx конфигурациясын баптау
Certbot сайтыңыздың домені көрсетілуі тиіс server_name директивасына сүйеніп, нақты виртуалды хостқа жүгінеді.
Егер Nginx виртуалды хосттарын баптау жөніндегі алдыңғы нұсқаулығымызды орындаған болсаңыз, сізде /etc/nginx/sites-available/сайт_атауы жолында (мысалы, /etc/nginx/sites-available/testsite.dev) виртуалды хост файлы жасалған болуы тиіс.
Тексеру үшін файлды мәтіндік редакторда ашайық:
sudo nano /etc/nginx/sites-available/testsite.dev
Ондағы server_name директивасын тауып, онда доменіңіз көрсетілгеніне көз жеткізіңіз:
...
server_name testsite.dev www.testsite.dev;
...
Қажет болса, өзгерістер енгізіп, файлды сақтаңыз.
Содан кейін Nginx конфигурациясында қателердің бар-жоғын тексеріңіз:
sudo nginx -t
Егер қателер болмаса, веб-серверді қайта іске қосыңыз:
sudo systemctl reload nginx
3-қадам. Брандмауэрді баптау
Әрі қарай брандмауэр арқылы HTTPS трафигіне рұқсат беру қажет.
Брандмауэрдің ағымдағы ережелерін келесі команда арқылы тексеріңіз:
sudo ufw status
Егер тек HTTP трафигіне рұқсат етілсе, шығыс шамамен мынадай болады:
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
Nginx HTTP ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Nginx HTTP (v6) ALLOW Anywhere (v6)
Өзгерістер енгізейік, атап айтқанда HTTPS трафигіне рұқсат берейік. Ол үшін мынаны орындаймыз:
sudo ufw allow 'Nginx Full'
Nginx Full профилі трафиктің екі түріне де рұқсат береді: 443 портындағы HTTPS-ке де, 80 портындағы HTTP-ге де.
HTTP трафигіне бөлек рұқсат берудің енді қажеті жоқ, сондықтан артық директиваны жоямыз:
sudo ufw delete allow 'Nginx HTTP'
Брандмауэр баптауларын қайта тексерейік:
sudo ufw status
Егер бәрі дұрыс болса, барлық трафикке (Nginx Full) рұқсат етілгенін көресіз:
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
Nginx Full ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Nginx Full (v6) ALLOW Anywhere (v6)
4-қадам. SSL алу
Nginx конфигурациясын жаңарту үшін Certbot-ты Nginx плагинімен іске қосыңыз:
sudo certbot --nginx -d testsite.dev -d www.testsite.dev
Алғаш іске қосқан кезде сізден байланыс email-ін көрсету, сондай-ақ лицензиялық келісімнің шарттарын қабылдау сұралады.
Содан кейін HTTPS-ті қалай баптағыңыз келетінін таңдаңыз:
HTTP-ге қол жеткізуді алып тастап, HTTP трафигін HTTPS-ке қайта бағыттағыңыз келетінін таңдаңыз.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: Қайта бағыттамау - Веб-сервер конфигурациясына қосымша өзгерістер енгізбеу.
2: Қайта бағыттау - Барлық сұраныстарды қауіпсіз HTTPS қолжетімділігіне қайта бағыттау. Бұл нұсқаны
жаңа сайттар үшін немесе сайтыңыз HTTPS арқылы жұмыс істейтініне сенімді болсаңыз таңдаңыз. Бұл
өзгерісті веб-сервер конфигурациясын өңдеу арқылы болдырмауға болады.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Тиісті нөмірді [1-2] таңдап, [енгізіңіз] (болдырмау үшін 'c' басыңыз):
Процесс аяқталғанда жүйе оның сәтті орындалғаны туралы хабарлайды және сертификаттардың орналасқан жерін көрсетеді:
IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/testsite.dev/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/testsite.dev/privkey.pem
Your cert will expire on 2022-12-27. To obtain a new or tweaked
version of this certificate in the future, simply run certbot again
with the "certonly" option. To non-interactively renew *all* of
your certificates, run "certbot renew"
- 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
Енді доменіңізге HTTPS хаттамасы арқылы жүгіне аласыз.
5-қадам. SSL-ді автоматты түрде жаңарту
Let’s Encrypt сертификаттарының қолданылу мерзімі 90 күн, сондықтан оларды мезгіл-мезгіл жаңартып отыру керек. Әрине, мұны келесі команда арқылы қолмен жасауға болады:
certbot renew
Дегенмен бұл процесті тиісті cron-тапсырма жасау арқылы автоматтандыруға болады:
crontab -e
Автоматты жаңартуды орнату үшін келесі жолды қосыңыз:
30 3 * * 2 /usr/bin/certbot renew >> /var/log/renew-ssl.log
Осылайша, әр сейсенбі түнгі 03:30-да Certbot мерзімінің өтуіне 30 күннен аз қалған сертификаттарды автоматты түрде тексеріп, жаңартып отырады. Нәтижелер renew-ssl.log файлына жазылады.
Бар сертификатты орнату
Егер сізде SSL сертификаты бұрыннан бар болса, оны осы нұсқаулықтар бойынша орната аласыз.
1-қадам. Сертификат файлдарын серверге жүктеу
- Әдетте сертификатты сатып алғаннан кейін сізде келесі файлдар болады: сертификаттың өзі (.crt) және аралық және түбірлік сертификаттарды қамтитын сертификаттар тізбегі (.ca-bundle).
Бұл файлдардың мазмұнын бос орынсыз бірінің астына бірін орналастырып, бір доменіңіз.crt файлына көшіріңіз. Ол үшін мәтіндік редакторды, мысалы, Блокнотты пайдалануға болады.
Нәтижесінде шамамен мынадай болуы керек:
-----BEGIN CERTIFICATE-----
#Сертификат#
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
#Аралық сертификат#
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
#Түбірлік сертификат#
-----END CERTIFICATE-----
Файлдар тізбегін хостинг-провайдеріңізге көмек сұрап жүгіну арқылы алуға немесе мына сервис арқылы генерациялауға болады: https://whatsmychaincert.com/.
- Сондай-ақ SSL сатып алғаннан кейін сізде жабық кілті бар файл болады.
Егер сізде Private KEY файлы жоқ болса, оны сертификат сатып алынған провайдерден сұраңыз.
доменіңіз.key атауымен жаңа файл жасап, оған жабық кілттің мазмұнын қойыңыз.
- Серверіңізге FTP/SFTP арқылы қосылып, файлдарды /etc/ssl каталогына жүктеңіз.
Егер сізде SSH арқылы қол жеткізу мүмкіндігі болса, қажетті файлдарды /etc/ssl каталогында былай жасауға да болады:
sudo nano /etc/ssl/mydomain.ru.crt
Жаңа файл ашылады. Бұл файлға сертификат пен тізбектің мазмұнын қойып, өзгерістерді сақтаңыз (Ctrl+X, содан кейін Y және Enter пернелерін басыңыз).
Содан кейін кілтке арналған файл жасаңыз:
sudo nano /etc/ssl/mydomain.ru.key
Кілт файлының мазмұнын қойып, өзгерістерді сақтаңыз.
2-қадам. Nginx конфигурациялық файлын баптау
Баптауларыңызға байланысты Nginx-тің негізгі конфигурациялық файлын (/etc/nginx/nginx.conf) немесе, егер оны бұрын жасаған болсаңыз, виртуалды хосттың конфигурациялық файлын өзгерту қажет болуы мүмкін.
Егер Nginx орнату жөніндегі нұсқаулығымызды орындаған болсаңыз, сізде /etc/nginx/sites-available/доменіңіз.conf каталогында виртуалды хосттың конфигурациялық файлы жасалған болуы тиіс.
Оны ашыңыз:
sudo nano /etc/nginx/sites-available/доменіңіз.conf
server{} блогында мынаны:
listen 80;
listen [::]:80;
мынаған ауыстырыңыз:
listen 443 ssl;
Мына жолдың астына:
server_name доменіңіз www.доменіңіз;
Сертификат пен кілт файлдарына апаратын жолдарды көрсетіңіз:
ssl_certificate /etc/ssl/доменіңіз.crt;
ssl_certificate_key /etc/ssl/доменіңіз.key;
Сайтыңызға HTTP арқылы жүгінетін клиенттерді қауіпсіз қосылымға қайта бағыттау үшін бар мазмұнның астына келесі server{} блогын қосыңыз:
server {
listen 80;
listen [::]:80;
server_name доменіңіз www.доменіңіз;
return 302 https://$server_name$request_uri;
}
Бұл жағдайда уақытша қайта бағыттауды (302) орнатамыз. Сайттың дұрыс жұмыс істейтініне толық көз жеткізгеннен кейін оны тұрақтыға (301) өзгерту ұсынылады.
Нәтижесінде конфигурациялық файлыңыз шамамен былай көрінуі тиіс:
server {
listen 443 ssl;
server_name mydomain.ru www.mydomain.ru;
ssl_certificate /etc/ssl/mydomain.ru.crt;
ssl_certificate_key /etc/ssl/mydomain.ru.key;
root /var/www/mydomain.ru/html;
index index.html index.xml;
}
server {
listen 80;
listen [::]:80;
server_name mydomain.ru www.mydomain.ru;
return 302 https://$server_name$request_uri;
}
Жоғарыда келтірілген баптаулар SSL сертификатының жұмысын қамтамасыз ету үшін жеткілікті. Өзгерістерді сақтап, 4-қадамға өтуге болады. Алайда SSL пайдаланған кезде Nginx жұмысын қосымша оңтайландырғыңыз келсе, келесі қадамда қарастыратын бірнеше қосымша параметрді баптауға болады.
3-қадам. Қосымша баптаулар (міндетті емес)
- SSL пайдаланған кезде Nginx өнімділігін арттыру үшін SSL-сессияларды кэштеуді қосуға болады.
-
- Барлық жұмыс процестері пайдаланатын shared-кэшті орнатып, кэш өлшемін — 10 МБ деп көрсетейік:
ssl_session_cache shared:SSL:10m;
Бұл жолдарды, келесілері сияқты, server{} блогына сертификаттарға апаратын жолдары бар жолдардан кейін қосу керек.
-
- Кэш таймаутын 10 минут етіп орнатайық:
ssl_session_timeout 10m;
Таймаут SSL-сессия параметрлерін қайта пайдалануға болатын уақыт кезеңін анықтайды. Әдепкі бойынша таймаут 5 минут. Егер бұл мән сізге қолайлы болса, ssl_session_timeout директивасын көрсету міндетті емес. Алайда веб-сервердің өнімділігін жақсарту үшін таймаутты ұлғайтқыңыз келсе, оны ұзағырақ аралықпен, мысалы, 1 күн (1d) деп көрсетуге болады.
-
- Бір қосылымның жұмыс уақытын орнатайық:
keepalive_timeout 70;
- Келушілеріңіз үшін сайт беттерінің жүктелу жылдамдығын жақсарту мақсатында SSL stapling опциясын белсендіруге болады, ол серверге сертификаттың жарамдылығын тексеру үшін OCSP-жауаптарды тіркеуге мүмкіндік береді.
Ол үшін SSL сертификатын сатып алған кезде алған түбірлік сертификатты қамтитын ca.crt файлын жасау қажет (әдетте бұл түбірлік сертификат тізбекте соңғы болып келеді).
Жасалған файлды серверге сертификаттар орналасқан каталогқа, әдетте /etc/ssl каталогына орналастырыңыз.
Келесі директиваны қосып, SSL stapling-ті іске қосыңыз:
ssl_stapling on;
Түбірлік сертификатқа апаратын жолды көрсетіңіз:
ssl_trusted_certificate /etc/ssl/ca.crt;
DNS көрсетіңіз:
resolver 8.8.8.8;
Енгізілген өзгерістерді сақтаңыз.
Қорытынды конфигурация шамамен мынадай болуы тиіс:
server {
listen 443 ssl;
server_name mydomain.ru www.mydomain.ru;
ssl_certificate /etc/ssl/mydomain.ru.crt;
ssl_certificate_key /etc/ssl/mydomain.ru.key;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
keepalive_timeout 70;
ssl_stapling on;
ssl_trusted_certificate /etc/ssl/ca.crt;
resolver 8.8.8.8;
root /var/www/mydomain.ru/html;
index index.html index.xml;
}
server {
listen 80;
listen [::]:80;
server_name mydomain.ru www.mydomain.ru;
return 302 https://$server_name$request_uri;
}
4-қадам. Брандмауэрді баптау
Брандмауэрдің ағымдағы баптауларын тексеріңіз:
sudo ufw status
Егер шығыста Nginx HTTPS немесе Nginx Full профильдері болмаса, бұл қазіргі уақытта тек HTTP трафигіне рұқсат етілгенін білдіреді.
Жағдайды түзету үшін Nginx Full профилін қосып, Nginx HTTP профилін жойыңыз. Nginx Full профилі трафиктің екі түріне де рұқсат береді: 443 портындағы HTTPS-ке де, 80 портындағы HTTP-ге де.
sudo ufw allow 'Nginx Full'
sudo ufw delete allow 'Nginx HTTP'
Брандмауэрдің жаңартылған баптауларын тексеріңіз:
sudo ufw status
Шығыс былай көрінуі тиіс:
Status: active
To Action From
-- ----- ----
OpenSSH ALLOW Anywhere
Nginx Full ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Nginx Full (v6) ALLOW Anywhere (v6)
5-қадам. Баптауларды қолдану
Nginx конфигурациясын тексеріңіз:
sudo nginx -t
Енгізілген өзгерістерді қолдану үшін Nginx-ті қайта іске қосыңыз:
sudo /etc/init.d/nginx restart
Осыдан кейін сайтыңыздың HTTPS хаттамасы арқылы дұрыс жұмыс істейтініне көз жеткізіңіз.