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:
- Telah melakukan konfigurasi awal server. Anda dapat lihat tutorial pengaturan awal pada Ubuntu Server 20.04.
- Telah memiliki domain. Anda dapat membelinya di penyedia domain kepercayaan anda misalnya idwebhost, Godaddy, Namecheap dan lainnya.
- Telah menghubungkan domain ke server atau VPS. Anda dapat menggunakan fitur DNS hosting di Cloudflare untuk menghubungkannya, silahkan baca tulisan saya tentang tutorial menghubungkan domain ke server dengan DNS Cloudflare.
- Telah menginstall Nginx. Silahkan baca cara install Nginx, MariaDB, PHP (LEMP) di Ubuntu 20.04.
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
danssl_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).
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.
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).