LetEncrypt with Nginx on Ubuntu

LetEncrypt with Nginx on Ubuntu

mmwebfonts ကို https အတွက် cloudflare ကို အသုံးပြုထားခဲ့ပါတယ်။ ပြဿနာကတော့ MPT connection ပဲ။ ornagai website ကို DDOS အများဆုံး တိုက်တာကလည်း MPT IP ကပဲ။ တခြား website တွေကလည်း အဲဒီ ပြဿနာရှိတာကြောင့် MPT IP ဆိုရင် bot လား လူလား စစ်တဲ့ အဆင့် ကို cloud flare က ထည့်ထားတယ်။ ဒါကြောင့် mmwebfonts ကို cloudflare ကနေပြီးတော့ LetsEncrypt ကို ပြောင်းလိုက်ပါတယ်။ LetsEncrypt ဟာ ကိုယ့်ရဲ့ website တိုင်းကို အခမဲ့ verify https support ရအောင် ဖန်တီးပေးနိုင်ပါတယ်။

ဒါနဲ့ Digital Ocean မှာ ဘယ်လို လုပ်ရမလဲ ဆိုတာကို အဆင့်ဆင့် ရေးထားတာလေးကို ဖတ်ဖြစ်ခဲ့တယ်။ အဲဒါလေးကို အခြေခံပြီးတော့ အခြားလူတွေလည်း အသုံးဝင်အောင် မြန်မာလို ပြန်ရေးပြီး ဖော်ပြလိုက်ပါတယ်။

Install Let’s Encrypt Client

Let’s Encrypt ကို အသုံးပြုဖို့အတွက် ပထမဆုံး letsencrypt ကို သွင်းဖို့ လိုပါတယ်။ မသွင်းခင်မှာ apt နဲ့ update လုပ်ပြီးတော့ apt နဲ့ ပဲ ubuntu မှာ သွင်းပါမယ်။

sudo add-apt-repository ppa:certbot/certbot
sudo apt-get update
sudo apt-get install letsencrypt

lets encrypt ပြီးသွားရင်တော့ SSL certificate ကို ရအောင် လုပ်ဖို့ လိုပါတယ်။

Obtain an SSL Certificate

SSL certificate ကို ယူတဲ့ နည်းလမ်း အများကြီး ရှိပါတယ်။ အခုတော့ webroot plugin ကို သုံးပြီးတော့ SSL certificate ကို ယူပါမယ်။

Webroot

Webroot အတွက် အရင်ဆုံး well-know file ကို ကိုယ့်ရဲ့ domain မှာ allow ပေးဖို့ လိုပါတယ်။

အရင်ဆုံး ကိုယ့် ရဲ့ site-available config လေးကို ပြင်ဖို့ လိုပါတယ်။

ဥပမာ အနေနဲ့ mywebsite.com ဆိုပြီး ပြထားပါတယ်။

sudo vi /etc/nginx/sites-available/www.mywebsite.com

vi နဲ့ mywebsite.com ရဲ့ nginx config မှာ .well-know ကို ဖြည့်ဖို့ လိုပါတယ်။

location ~ /.well-known {
    allow all;
}

ပြီးရင် nginx ရဲ့ config မှန် မမှန် ကို test လုပ်ကြည့်ပါမယ်။

sudo nginx -t

ဘာ error မှ မရှိဘူးဆိုရင် တော့ restart ချပါမယ်။

sudo systemctl restart nginx

အခု let encrypt ကို အသုံးပြုပြီးတော့ ssl certificate ကို ဖန်တီးပါမယ်။

sudo letsencrypt certonly -a webroot --webroot-path=/var/www/mywebsite.com -d mywebsite.com -d www.mywebsite.com

webroot-path မှာတော့ mywebsite.com ရှိတဲ့ နေရာပါ။ domain ကိုတော့ -d နဲ့ အသုံးပြုနိုင်ပါတယ်။ www ကော www မပါတဲ့ domain အတွက်ပါ generate လုပ်မှာမို့ -d ၂ ခုကို အသုံးပြုထားပါတယ်။

အထက်ပါ code ကို run လိုက်ရင် dialog လေးနဲ့ အဆင့်ဆင့် လုပ်ဆောင်ရန်ပေါ်လာပါလိမ့်မယ်။

Certificate Files

ပြီးတဲ့ အခါမှာ အောက်ဖော်ပြပါ file တွေ ကို ရရှိပါလိမ့်မယ်။

  • cert.pem: domain အတွက် certificate
  • chain.pem: The Let’s Encrypt chain certificate
  • fullchain.pem: cert.pem နှင့် chain.pem ပေါင်းထားသည့် file
  • privkey.pem: certificate ၏ private key

အဲဒီ file တွေဟာ /etc/letsencrypt/archive ထဲမှာ ဖန်တီးသွားပါတယ်။ နောက်ပြီးတော့ symbolic links အနေနဲ့ /etc/letsencrypt/live/your_domain_name folder ထဲမှာ ဖန်တီးပေးထားပါတယ်။ အဲဒီ folder ထဲမှာ ရှိတဲ့ file တွေကို ကျွန်တော်တို့တွေ အသုံးပြုရမှာပါ။

အရင် ဆုံး file ရှိမရှိ စစ်ကြည့်ဖို့လိုပါတယ်။

sudo ls -l /etc/letsencrypt/live/your_domain_name

ကျွန်တော့် domain name က mywebsite.com ဆိုတော့

sudo ls -l /etc/letsencrypt/live/mywebsite.com

ဆိုပြီး စစ်ဖို့ လိုပါတယ်။

Generate Strong Diffie-Hellman Group

ပိုပြီး လုံခြုံအောင် အတွက် Diffie-Hellman group ကို ဖန်တီးဖို့လိုပါတယ်။

sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

ခဏလောက်စောင့်ပြီးရင်တော့ DH group file ကို /etc/ssl/certs/dhparam.pem မှာ ရနိုင်ပါပြီ။

Configure TLS/SSL on Web Server (Nginx)

အခု နောက်ဆုံး အဆင့် အနေနဲ့ SSL file ကို Nginx မှာ အသုံးပြုပါတော့မယ်။ ကျွန်တော်တို့တွေ domain ရဲ့ config မှာ တိုက်ရိုက် မရေးပဲ ပိုပြီးရှင်းအောင် သီးသန့် file ခွဲထုတ်ပါမယ် ပြီးရင် အဲဒီ config file ကို domain ထဲမှာ ထည့်ပါမယ်။

Create a Configuration Snippet Pointing to the SSL Key and Certificate

snippets folder အောက်မှာ file တစ်ခု ဖန်တီးပါမယ်။

sudo vi /etc/nginx/snippets/ssl-mywebsite.com.conf

အဲဒီ အထဲမှာ အောက်မှာ စာ နှစ်ကြောင်း ထည့်ပါမယ်။

ssl_certificate /etc/letsencrypt/live/mywebsite.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/mywebsite.com/privkey.pem;

Create a Configuration Snippet with Strong Encryption Settings

အခု နောက်ထပ် SSL config တစ်ခု ဖန်တီးပါအုံးမယ်။ ဒါကတော့ ပိုပြီးတော့ လုံခြုံ စိတ်ချရမှု ရှိအောင်ပါ။

sudo vi /etc/nginx/snippets/ssl-params.conf

အဲဒီ file ထဲမှာ အောက်ပါ code ကို ထည့်ပါမယ်။

# from https://cipherli.st/
# and https://raymii.org/s/tutorials/Strong_SSL_Security_On_nginx.html

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;
# Disable preloading HSTS for now.  You can use the commented out header line that includes
# the "preload" directive if you understand the implications.
#add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
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;

Adjust the Nginx Configuration to Use SSL

အခု ကျွန်တော်တို့ ရဲ့ domain nginx file ကို ပြင်ဖို့ အချိန်ရောက်လာပါပြီ။ ဘာမှ မလုပ်သေးခင်မှာ backup လုပ်ဖို့ လိုပါတယ်။

sudo cp /etc/nginx/sites-available/www.mywebsite.com /etc/nginx/sites-available/www.mywebsite.com

ပြီးရင်တော့ စပြင်ရအောင်

sudo vi /etc/nginx/sites-available/www.mywebsite.com

အောက်က လိုမျိုး ရှိနေတတ်ပါတယ်။

server {
    server_name www.mywebsite.com mywebsite.com;
    root /var/www/mywebsite.com;
    …

ဆိုပြီး ရှိနေပါလိမ့်မယ်။ http အစား https ကို ပြောင်းမှာဖြစ်သည့်အတွက်ကြောင့် အောက်ကလို ပြင်ပါမယ်။ ကတော့ အခြား config တွေပေါ့။

server {
    listen 80;
    server_name www.mywebsite.com mywebsite.com;
    return 301 https://$host$request_uri;
}

server {
        # SSL configuration
    listen 443 ssl http2 default_server;
    listen [::]:443 ssl http2 default_server;
    server_name www.mywebsite.com mywebsite.com;
    include snippets/ssl-mywebsite.com.conf;
    include snippets/ssl-params.conf;
    …

ကတော့ အခြား config တွေကို SSL အောက်မှာ ရွှေ့လိုက်တာပါ။

(Alternative Configuration) Allow Both HTTP and HTTPS Traffic

တကယ်လို့ http ကော https ကော support လုပ်ချင်ရင်တော့

server {
        listen 80 default_server;
    listen [::]:80 default_server;
    listen 443 ssl http2 default_server;
    listen [::]:443 ssl http2 default_server;
    server_name www.mywebsite.com mywebsite.com;
    include snippets/ssl-mywebsite.com.conf;
    include snippets/ssl-params.conf;
    …

ဒါဆိုရင်တော့ http တွေကို https ကို အတင်းမပြောင်းခိုင်းတော့ပါဘူး။ ကျွန်တော်ကတော့ https တစ်ခုတည်း support လုပ်တာကို ပိုပြီးတော့ သဘောကျပါတယ်။ http တွေကို အလိုအလျောက် https ပြောင်းလိုက်တာကို ပိုပြီး နှစ်သက်ပါတယ်။

Enabling the Changes in Nginx

ကဲ ပြီးပါတော့မယ်ဗျာ။ အခု Nginx မှာ ပြင်ထားတာတွေ မှန် မမှန် ပြန်စစ်ပါတယ်။

sudo nginx -t

တကယ်လို့ အဆင်ပြေပြီ ဆိုရင်တော့

sudo systemctl restart nginx

nginx ကို restart ချနိုင်ပါပြီ။ ဒါဆိုရင် ကိုယ့်ရဲ့ website ဟာ https ကို ရရှိပါပြီ။

သေချာအောင်လို့ browser မှာ အောက်ကလို ရိုက်ကြည့်ပါ.

https://www.ssllabs.com/ssltest/analyze.html?d=mywebsite.com

Set Up Auto Renewal

Letsencrypt ကို renew လုပ်ချင်တယ်ဆိုရင်

sudo letsencrypt renew

ကို run ပေးရပါတယ်။

အပတ်တိုင်း certificate ကို update လုပ်ချင်တယ်ဆိုရင် crontab မှာ ထည့်ပြီး ပြင်ပေးလိုက်ရုံပါပဲ။

sudo crontab -e

ပြီးရင်တော့ crontab ထဲမှာ

30 2 * * 1 /usr/bin/letsencrypt renew >> /var/log/le-renew.log
35 2 * * 1 /bin/systemctl reload nginx

အပတ်တိုင်း တနင်္လာနေ့ 2:30 AM မှာ letencrypt ကို renew လုပ်ပြီးတော့ 2:35 AM မှာ nginx ကို ပြန်ပြီး reload လုပ်မယ်လို့ ဆိုလိုတာပါ။ renew လုပ်သည့် log တွေကို /var/log/le-renew.log မှာ ကြည့်နိုင်အောင် ဖန်တီးထားပါတယ်။

အခု ဆိုရင်တော့ ကိုယ့် ရဲ့ domain မှာ letsencrypt လွယ်လင့်တကူ အသုံးပြုနိုင်ပြီးတော့ https အတွက် ပိုက်ဆံ ထပ်ကုန်စရာ မလိုတော့ဘူးပေါ့ဗျာ။

2 Comments

  1. subdomain တှမှောပါ အဆငျပွလေားဗြ ? Wildcards မရှိတော့ cdn တှသေုံးတဲ့အခါမှာ နညျးနညျးလေးတော့ တိုငျပတျတယျလို့ထငျမိတယျဗြ T_T

    1. saturngod says:

      yes, it’s working fine with subdomain. but don’t use with cloudflare https together. it will not working well.

Leave a Comment

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.