DEV Community

Cover image for Cara proteksi Nginx dengan Let’s Encrypt di Ubuntu 18.04
Erol Joudy
Erol Joudy

Posted on • Edited on • Originally published at blog.erol.dev

Cara proteksi Nginx dengan Let’s Encrypt di Ubuntu 18.04

Let’s Encrypt dikembangkan oleh Internet Security Research Group (ISRG) yang memungkinkan semua website di internet memperoleh sertifikat SSL dengan gratis dan terpercaya.

Pembahasan dalam tutorial ini akan menunjukkan cara memproteksi Nginx server dengan Let’s Encrypt menggunakan certbot tool pada Ubuntu 18.04.

Persiapan

Pastikan beberapa hal berikut ini sudah dilakukan lebih dulu.

  • Domain sudah diset mengarah ke IP server. Artikel ini akan menggunakan domain contoh.com
  • Nginx sudah terpasang. Jika belum, silahkan ikuti langkahnya pada artikel berikut ini.

Instalasi Certbot

Certbot adalah tool yang akan memudahkan dalam proses membuat, memperpanjang, dan mengatur penggunaan sertifikat SSL dari Let’s Encrypt.

Untuk mendaftarkan certbot, jalankan perintah berikut secara berurutan. Perintah pada baris terakhir akan membutuhkan waktu yang agak lama, harap sabar menunggu hingga selesai.

sudo apt install certbot sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048 
Enter fullscreen mode Exit fullscreen mode

Pendaftaran sertifikat SSL dari Let’s Encrypt

Jalankan perintah berikut secara berurutan.

mkdir -p /var/lib/letsencrypt/.well-known chgrp www-data /var/lib/letsencrypt chmod g+s /var/lib/letsencrypt 
Enter fullscreen mode Exit fullscreen mode

Langkah selanjutnya adalah dengan membuat 2 (dua) buah file snippet yang dibutuhkan, yaitu file letsencrypt.conf dan ssl.conf. Untuk membuat file yang pertama, jalankan perintah ini.

vi /etc/nginx/snippets/letsencrypt.conf 
Enter fullscreen mode Exit fullscreen mode

Pada editor teks yang terbuka, salin kode dibawah ini.

location ^~ /.well-known/acme-challenge/ { allow all; root /var/lib/letsencrypt/; default_type "text/plain"; try_files $uri =404; } 
Enter fullscreen mode Exit fullscreen mode

Simpan perubahan, dan lanjutkan dengan menjalankan perintah berikut ini untuk membuat file yang kedua.

vi /etc/nginx/snippets/ssl.conf 
Enter fullscreen mode Exit fullscreen mode

Pada editor teks yang terbuka, salin kode berikut.

ssl_dhparam /etc/ssl/certs/dhparam.pem; ssl_session_timeout 1d; ssl_session_cache shared:SSL:50m; ssl_session_tickets off; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS'; ssl_prefer_server_ciphers on; ssl_stapling on; ssl_stapling_verify on; resolver 8.8.8.8 8.8.4.4 valid=300s; resolver_timeout 30s; add_header Strict-Transport-Security "max-age=15768000; includeSubdomains; preload"; add_header X-Frame-Options SAMEORIGIN; add_header X-Content-Type-Options nosniff; 
Enter fullscreen mode Exit fullscreen mode

Simpan perubahan, selanjutnya tambahkan file letsencrypt.conf pada server block milik domain contoh.com

sudo vi /etc/nginx/sites-available/contoh.com 
Enter fullscreen mode Exit fullscreen mode

Tambahkan baris kode berikut ini dalam file tersebut.

 include snippets/letsencrypt.conf; 
Enter fullscreen mode Exit fullscreen mode

Konfigurasinya akan terlihat seperti ini.

server { listen 80; server_name example.com www.example.com; include snippets/letsencrypt.conf; } 
Enter fullscreen mode Exit fullscreen mode

Simpan perubahannya, dan jalankan perintah berikut untuk mengaktifkannya.

sudo ln -s /etc/nginx/sites-available/contoh.com /etc/nginx/sites-enabled/ 
Enter fullscreen mode Exit fullscreen mode

Jika muncul pesan “File exists” seperti dibawah ini, abaikan saja dan lanjutkan ke langkah berikut. Pesan ini berarti symbolic link untuk file ini sudah ada, dan itu bukanlah sebuah masalah.

ln: failed to create symbolic link '/etc/nginx/sites-enabled/contoh.com': File exists 
Enter fullscreen mode Exit fullscreen mode

Langkah berikutnya, restart Nginx.

sudo systemctl restart nginx 
Enter fullscreen mode Exit fullscreen mode

Sesudah restart, jalankan perintah berikut untuk mendaftarkan sertifikat SSL untuk server block domain yang baru dibuat diatas.

sudo certbot certonly --agree-tos --email admin@contoh.com --webroot -w /var/lib/letsencrypt/ -d contoh.com -d www.contoh.com 
Enter fullscreen mode Exit fullscreen mode

Output yang dihasilkan apabila sertifikat SSL berhasil diperoleh, akan terlihat seperti dibawah ini.

IMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at: /etc/letsencrypt/live/contoh.com/fullchain.pem Your key file has been saved at: /etc/letsencrypt/live/contoh.com/privkey.pem Your cert will expire on 2019-07-28. To obtain a new or tweaked version of this certificate in the future, simply run certbot again. To non-interactively renew *all* of your certificates, run "certbot renew" - Your account credentials have been saved in your Certbot configuration directory at /etc/letsencrypt. You should make a secure backup of this folder now. This configuration directory will also contain certificates and private keys obtained by Certbot so making regular backups of this folder is ideal. - 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 
Enter fullscreen mode Exit fullscreen mode

Sekarang setelah sertifikat SSL sudah diperoleh, edit kembali file konfigurasi server block.

sudo vi /etc/nginx/sites-available/contoh.com 
Enter fullscreen mode Exit fullscreen mode

Untuk editor teks yang muncul, salin dan update dengan menggunakan kode dibawah ini.

server { listen 80; server_name www.contoh.com contoh.com; root /var/www/contoh.com/public_html; index index.html; include snippets/letsencrypt.conf; access_log /var/log/nginx/contoh.com.access.log; error_log /var/log/nginx/contoh.com.error.log; location / { try_files $uri $uri/ =404; } return 301 https://$host$request_uri; } server { listen 443 ssl http2; server_name www.contoh.com; root /var/www/contoh.com/public_html; index index.html; ssl_certificate /etc/letsencrypt/live/contoh.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/contoh.com/privkey.pem; ssl_trusted_certificate /etc/letsencrypt/live/contoh.com/chain.pem; include snippets/ssl.conf; include snippets/letsencrypt.conf; return 301 https://contoh.com$request_uri; } server { listen 443 ssl http2; server_name contoh.com; root /var/www/contoh.com/public_html; index index.html; ssl_certificate /etc/letsencrypt/live/contoh.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/contoh.com/privkey.pem; ssl_trusted_certificate /etc/letsencrypt/live/contoh.com/chain.pem; include snippets/ssl.conf; include snippets/letsencrypt.conf; # . . . kode lainnya } 
Enter fullscreen mode Exit fullscreen mode

Dengan kode diatas, domain contoh.com akan dipaksa menggunakan https sekaligus redirect akses menggunakan www.contoh.com ke contoh.com (non-www).

Simpan perubahannya dan reload Nginx.

sudo systemctl reload nginx 
Enter fullscreen mode Exit fullscreen mode

Buka browser, lalu akses dengan menggunakan https://contoh.com

Perpanjang otomatis sertifikat SSL

Sertifikat SSL Let’s Encrypt berlaku selama 90 hari. Untuk membuatnya otomatis memperpanjang sertifikat yang akan habis masa berlakunya, certbot membuat sebuah cronjob yang berjalan sebanyak 2x tiap hari, dan akan langsung memperpanjang sertifikat yang akan habis masa berlaku dalam 30 hari.

Berikut ini adalah cara untuk membuat cronjob yang akan memperpanjang otomatis sertifikat SSL yang akan expired, sekaligus melakukan reload pada Nginx.

Pertama, edit cronjob milik certbot dengan perintah ini.

sudo vi /etc/cron.d/certbot 
Enter fullscreen mode Exit fullscreen mode

Ubah baris cronjob yang sudah ada menjadi seperti dibawah ini.

0 */12 * * * root test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(3600))' && certbot -q renew --renew-hook "systemctl reload nginx" 
Enter fullscreen mode Exit fullscreen mode

Simpan perubahan diatas, selanjutnya untuk mengecek proses perpanjangan sertifikat SSL, bisa dicoba dengan perintah --dry-run berikut ini.

sudo certbot renew --dry-run 
Enter fullscreen mode Exit fullscreen mode

Jika tidak muncul error, maka outputnya akan terlihat seperti ini.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ** DRY RUN: simulating 'certbot renew' close to cert expiry ** (The test certificates below have not been saved.) Congratulations, all renewals succeeded. The following certs have been renewed: /etc/letsencrypt/live/contoh.com/fullchain.pem (success) ** DRY RUN: simulating 'certbot renew' close to cert expiry ** (The test certificates above have not been saved.) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IMPORTANT NOTES: - Your account credentials have been saved in your Certbot configuration directory at /etc/letsencrypt. You should make a secure backup of this folder now. This configuration directory will also contain certificates and private keys obtained by Certbot so making regular backups of this folder is ideal. 
Enter fullscreen mode Exit fullscreen mode

Penutup

Sampai pada langkah ini, Let’s Encyrpt sudah terpasang dan akan secara otomatis memperpanjang sertifikat SSL sebelum masa aktif berakhir.

Untuk penjelasan detail bagaimana cara pengaturan Server Block milik Nginx, silahkan lihat artikel berikut ini.

Top comments (0)