Instalasi SSL Gratis Let's Encrypt untuk Nginx di Server Ubuntu 20.04

Untuk membuat website dengan protokol HTTPS kita membutuhkan sertifikat SSL. Umumnya untuk mendapatkan sertifikat SSL kita harus membayar pada penyedia SSL. Namun saat ini sudah ada beberapa organisasi yang mengembangkan SSL secara gratis. Salah satu yang paling banyak digunakan adalah Let’s Encrypt. Kita dapat menggunakannya secara gratis selamanya untuk website dan domain kita.

Lalu bagaimana cara menggunakannya? Pada tutorial ini saya akan membahas cara mendapatkan, menginstall dan mengkonfigurasi SSL gratis dari Let’s Encrypt secara lengkap untuk pengguna Ubuntu server 20.04. Baik itu di VPS, dedicated server ataupun jenis server lainnya. Tutorial ini khusus hanya untuk web server Nginx. Namun sebelum menuju ke langkah-langkahnya anda harus melakukan beberapa prasyarat di bawah ini.

Prasyarat:

Berikut ini adalah cara install SSL gratis dari Let’s Encrypt untuk Nginx di Ubuntu Server 20.04 VPS atau server lain.

1. Install Certbot

Update database repositori dahulu sebelum menginstall:

$ sudo apt update

Lakukan instalasi Certbot dengan perintah:

$ sudo apt -y install certbot python3-certbot-nginx

2. Tambahkan Subdomain pada Server Block di Nginx

Jika anda mengikuti tutorial install Nginx, MariaDB dan PHP (LEMP) di poin ke-4 pada prasyarat di atas maka anda perlu menambahkan semua subdomain di pengaturan server block nginx yang telah dibuat. Hal ini perlu dilakukan karena Certbot hanya akan mendeteksi domain atau subdomain yang sudah masuk pada pengaturan server block Nginx. Contohnya file yang telah saya buat pada tutorial tersebut adalah pada /etc/nginx/sites-available/namadomain. Edit file tersebut.

$ sudo nano /etc/nginx/sites-available/itkoding.com

Tambahkan semua subdomain yang ingin didaftarkan SSLnya pada bagian server_name. Misalnya saya ingin menambahkan subdomain www.itkoding.com. Maka cari kata server_name lalu tambahkan subdomain tersebut.

...
server_name itkoding.com www.itkoding.com;
...

Simpan file lalu tutup.

Reload nginx dengan perintah:

$ sudo systemctl reload nginx

3. Jalankan Certbot untuk Mendapatkan Sertifikat SSL

Ada 2 metode yang bisa digunakan untuk mendapatkan sertifikat. Pertama, meminta sertifikat sekaligus konfigurasinya secara otomatis sehingga HTTPS langsung diterapkan dengan konfigurasi standar. Kedua, hanya meminta sertifikat tanpa konfigurasi otomatis.

Lebih baik kita gunakan cara kedua agar bisa lebih leluasa mengatur sesuai style pengaturan kita. Berikut perintah untuk hanya request sertifikat:

$ sudo certbot certonly --nginx

Jika pertama kali menjalankan certbot maka kita akan diminta memasukkan E-mail address dan beberapa pertanyaan.

Enter email address (used for urgent renewal and security notices) (Enter 'c' to cancel): Isi dengan email anda.

(A)gree/(C)ancel: A Ketik A untuk menyetujui.

Would you be willing to share your email... (Y)es/(N)o: N Ketik N.

Which names would you like to activate HTTPS for?
1: itkoding.com
2: www.itkoding.com
Select the appropriate numbers separated by commas and/or spaces,
or leave input blank to select all options shown (Enter 'c' to cancel): 1 2 Ketik semua nomor yang ingin diberi SSL HTTPS, pisahkan dengan spasi.

Semua file SSL disimpan pada direktori /etc/letsencrypt/live/namadomain/ misalnya /etc/letsencrypt/live/itkoding.com/.

4. Tambahkan Server Block SSL di Nginx untuk Mengaktifkan HTTPS

Untuk mengaktifkan HTTPS maka kita harus menambahkan server block SSL dengan port 443 pada pengaturan pengaturan server block yang telah kita buat. Edit file /etc/nginx/sites-available/namadomain.

$ sudo nano /etc/nginx/sites-available/itkoding.com

Tambahkan konfigurasi server block di bawah ini pada bagian di paling bawah (sesuaikan dengan nama domain anda):

server {
        listen 443 ssl http2;
        root /var/www/itkoding;
        index index.php index.html index.htm index.nginx-debian.html;
        server_name itkoding.com www.itkoding.com;

        location / {
                try_files $uri $uri/ /index.php?$args;
        }

        location ~ \.php$ {
                include /etc/nginx/snippets/fastcgi-php.conf;
                fastcgi_pass unix:/run/php/php7.4-fpm.sock;
        }
 access_log /var/log/nginx/itkoding_com_access.log;
 error_log /var/log/nginx/itkoding_com_error.log;
 
 add_header Strict-Transport-Security "max-age=31536000";
 ssl_trusted_certificate /etc/letsencrypt/live/itkoding.com/chain.pem;
 ssl_certificate /etc/letsencrypt/live/itkoding.com/fullchain.pem;
 ssl_certificate_key /etc/letsencrypt/live/itkoding.com/privkey.pem;
 ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}

Simpan dan tutup file tersebut.

  • listen 443 ssl http2 digunakan untuk mengaktifkan port 443 dan HTTPS dengan protokol terbaru yaitu http2 yang lebih cepat.
  • ssl_trusted_certificate berisi file chain.pem dari direktori sertifikat Let’s Encrypt.
  • ssl_certificate berisi file fullchain.pem dari direktori Let’s Encrypt.
  • ssl_certificate_key berisi file privkey.pem.
  • ssl_dhparam berisi file ssl-dhparams.pem.

Pastikan anda telah mengubah konfigurasi di atas sesuai dengan nama domain anda.

5. Konfigurasi Tambahan Nginx untuk Optimasi SSL

Buat file baru untuk pengaturan umum SSL di direktori /etc/nginx/conf.d/ dengan nama ssl.conf.

$ sudo nano /etc/nginx/conf.d/ssl.conf

Isi file tersebut dengan konfigurasi berikut:

##
# SSL Settings
##
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;

ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA256';
ssl_session_tickets off;

ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s ipv6=off;
resolver_timeout 30s;

Simpan file lalu tutup file tersebut. File pada direktori conf.d akan otomatis dijalankan karena sudah dimasukkan pada konfigurasi utama Nginx.

Penjelasan:

  • ssl_protocols untuk mengatur protokol SSL yang digunakan. Kita menggunakan protokol terbaru TLSv1.3 yang lebih cepat dan TLSv1.2.
  • ssl_prefer_server_ciphers agar menggunakan urutan cipher dari server.
  • ssl_session_cache dan ssl_session_timeout untuk mengatur sesi SSL,
  • ssl_ciphers untuk mengatur ciphers. Konfigurasi di atas bersumber dari rekomendasi Mozilla.
  • ssl_stapling untuk mengaktifkan stapling SSL agar proses SSL lebih cepat.

6. Ubah Urutan Ciphers untuk TLSv1.3 pada OpenSSL

Urutan default dari OpenSSL menggunakan ciphers yang sangat aman namun lebih lambat. Untuk itu kita akan mengaturnya agar menggunakan cipher yang optimal.

Edit file /usr/lib/ssl/openssl.cnf

$ sudo nano /usr/lib/ssl/openssl.cnf

Tambahkan konfigurasi di bawah ini pada bagian paling atas:

openssl_conf = default_conf

Tambahkan konfigurasi ini di bagian paling bawah:

[default_conf]
ssl_conf = ssl_sect
[ssl_sect]
system_default = system_default_sect
[system_default_sect]
Ciphersuites = TLS_AES_128_GCM_SHA256:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_256_GCM_SHA384

Simpan file tersebut lalu tutup.

Terakhir, restart server untuk melihat perubahan dari konfigurasi OpenSSL.

$ sudo reboot

Buka domain anda dengan protokol HTTPS misalnya https://itkoding.com pada browser anda. Lalu lihat hasil HTTPS melalui chrome-devtools dengan cara klik kanan > pilih Inspect > klik Security. Maka TLS terdeteksi menggunakan TLS 1.3 (protokol terbaru) dan cipher X25519, and AES_128_GCM (aman tapi ringan).

Informasi ssl pada chrome devtools

7. Tes Domain pada SSL Labs

Kunjungi ssllabs.com lalu klik Test your server. Masukkan domain anda lalu tunggu hasilnya. Lihat hasilnya seharusnya bisa mendapatkan A+ dengan konfigurasi di atas.

Pengetesan ssl di ssllabs dengan nilai a+

Setelah menyelesaikan konfigurasi SSL maka server kita sudah siap untuk menggunakan HTTPS. Selanjutnya kita bisa mengisi server dengan website baik itu statik HTML, script PHP hingga CMS (wordpress, joomla, moodle dan lainnya).

M. Hernawan
Web developer yang juga suka dengan dunia sysadmin. Pernah belajar Teknik Informatika di Indonesia.

Kirim Komentar