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)