Assalamualaikum wr.wb.
TLS atau
Transport Layer Security adalah protokol yang digunakan untuk memproteksi dan
mengenkripsi lalu lintas jaringan komputer, pendahulu TLS adalah SSL (Secure
Socket Layer). Dengan SSL/TLS, komunikasi antara client dan server akan aman
dari usaha pencegatan (intercept) oleh orang lain yang tidak berwenang, mencegah
serangan Man-in-the-Middle, penyadapan (sniffing), dan pencurian data pribadi.
Fungsi sertifikat SSL/TLS :
- Memperkuat keamanan saat melakukan komunikasi atau transfer data melalui internet.
- Mengamankan data pribadi seperti nama pengguna (username), passord, kartu kredit, dan informasi lainnya dengan melakukan enkripsi.
- Bertindak sebagai kartu identitas digital untuk mengamankan jaringan.
- Memastikan integritas data yang dikirim tidak dimodifikasi selama proses transmisi.
Web server yang
kita install secara default menggunakan protokol HTTP/80 yang tidak aman karena
tidak adanya proses enkripsi terhadap data yang dikirimkan. Kita ambil contoh,
misalnya kamu mengakses web jual/beli online (e-commerces) yang masih
menggunakan HTTP, ketika menemukan barang yang dicari dan akan melakukan
pembayaran menggunakan kartu kredit. Informasi kartu kredit kamu (username,
password, nomor kartu, dll.) dikirim tanpa proses enkripsi. Jadi, siapapun yang
ingin berlaku jahat bisa mencegat dan melihat data tersebut, inilah serangan
MitM.
Jadi, apa
solusinya ? HTTPS (S-adalah Secure)/443 kini telah menjadi protokol standar
bagi semua website yang ada di Internet karena keamanannya, data yang
ditransfer melalui HTTPS akan dienkripsi. Untuk proses enkripsi tersebut
diperlukan tambahan konfigurasi sertifikat SSL/TLS (untuk saat ini yang
digunakan adalah TLS), sertifikat tersebut biasanya di dapatkan dari
Certificate Authority (CA) yaitu
organisasi yang dipercaya untuk menerbitkan sertifikat digital untuk situs web,
contoh CA yang populer saat ini adalah Let's Encrypt , DigiCert, Entrust
Datacard, GeoTrust, RapidSSL, Globalsign, GoDaddy, Sectigo dan lain-lain. Website
yang sudah mempunyai sertifikat SSL bisa diketahui dengan adanya tanda Gembok
di sebelah search bar browser. Sedangkan untuk web HTTP di browser modern
biasanya akan muncul peringatan seperti gambar sebelah kanan.
Pada blog kali
ini kita akan melakukan konfigurasi web HTTPS menggunakan sertifikat SSL/TLS
yang di tanda tangani sendiri (self-signed). Sertifikat yang ditandatangani
sendiri akan mengenkripsi komunikasi antara server dan client, namun karena
tidak divalidasi atau ditandatangani oleh certificate authority (CA) termasuk
oleh web browser, pengguna tidak bisa melakukan validasi mandiri saat mengakses
webnya, sehingga akan muncul pesan error tetapi tetap bisa diakses dan aman.
Sebuah
sertifikat self-signed bisa kita gunakan apabila belum memiliki nama domain
public yang terasosiasikan ke server atau instance yang kita buat. Jika
teman-teman sudah memiliki nama domain, lebih disarankan untuk menggunakan
sertifikat SSL/TLS yang di tandatangani oleh CA. Kamu bisa pakai CA yang gratis
dan terpercaya seperti Let’s Encrypt project.
Sebelum mengikuti tutorialnya, pastikan kamu sudah berhasil melakukan konfigurasi Sudoers, IP Addres, DHCP, DNS, dan LEMP Stack.
Langkah 1 –
Membuat Sertifikat TLS (Transport Layer Security).
Cara kerja
SSL/TLS adalah dengan membuat kombinasi public certificate dan private key. SSL
key menjaga kerahasiaan server dan melakukan enkripsi konten yang dikirimkan ke
klien. Sedangkan SSL certificate dibagikan secara publik kepada siapa saja yang
melakukan request konten ke web server. Ini juga bisa digunakan untuk mendekripsi
konten yang ditandatangai oleh SSL key.
Kita bisa membuat
self-signed key dan certificate pair menggunakan OpenSSL, dengan perintah
berikut.
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/nginx-selfssl.key -out /etc/ssl/certs/nginx-selfssl.crt
Kamu bisa
menggunakan backslash (\) untuk membuat baris baru agar perintah gampang
dibaca.
Keterangan :
sudo – Perintah sudo digunakan untuk membuat user biasa yang tergabung
kedalam grup sudo, secara sementara memiliki privileges root.
openssl – Perintah dasar berbasis CLI yang bisa digunakan untuk membuat dan
memanage OpenSSL sertifikat, keys, dan file lainnya.
req – Sub-perintah yang menspesifikasikan untuk menggunakan X.509
Cerificate Signing Request (CSR) management. “X.509” adalah infrastruktur
public key standar untuk SSL dan TLS.
-x509 – Menentukan X.509 sebagai tipe public key yang ingin dibuat.
-nodes – Melewati opsi keamanan untuk menentukan prasa-password
(passphrase) kedalam sertifikat. Kita membutuhkan Nginx yang bisa membaca file
tanpa intervensi dari user, ketika server dinyalakan.
-days 365 – Opsi untuk menentukan waktu valid sertifikat, disini kita set 365
hari (1 tahun).
-newkey
rsa:2048 – Melakukan generate key dan certifcate
baru dengan menggunakan algoritma RSA 2048 bit.
-keyout – Menentukan tempat untuk menyimpan private key yang sudah
digenerate.
-out – Menentukan tempat untuk menyinpan sertifikat setelah dibuat.
Setelah
memasukan perintah diatas akan ada pertanyaan tentang server, silahkan isi
secara benar.
Hal yang paling penting untuk dijawab adalah pertanyaan : Common Name (e.g. Server FQDN or YOUR name). kamu perlu mengisinya dengan nama domain, atau ip public server.
Contoh seperti
digambar berikut.
Selanjutnya kita
juga harus membuat strong Diffie-Hellman (DH) grup, untuk digunakan dalam
proses Perfect Forward Secrecy dengan klien. Gunakan perintah berikut.
sudo openssl dhparam -out /etc/nginx/dhparam.pem 2048
Tunggu beberapa
menit hingga proses pembuatan strong DH group berhasil *-/+ 5-10 menitan.
Langkah 2 – Membuat
file snippets
Selanjutnya kita lanjut ke tahapan konfigurasi SSL di web server Nginx, file key dan certificate yang sudah dibuat pada langkah-1 akan disimpan di dalam direkrtori /etc/ssl. Kita akan membuat file snippets (cuplikan) yang berisi informasi mengenai lokasi file SSL key dan certificate, ini bertujuan untuk memudahkan SSL dipanggil dalam script server blok dan dimungkinkan penggunaan berulang di web-web lainnya. Okee langsung saja kita buat file snippets pertama.
- Membuat file konfigurasi Snippet untuk pointing SSL key dan Cerificate
Buat file
snippets pada direktori /etc/nginx/snippets dengan nama nginx-sslself.conf.
sudo nano /etc/nginx/snippets/nginx-selfssl.conf
Setelah itu
tambahkan script berikut untuk mengarahkan posisi file key dan certificate.
ssl_certificate /etc/ssl/certs/nginx-selfssl.crt;
ssl_certificate_key /etc/ssl/private/nginx-selfssl.key;
- Membuat file konfigurasi snippet untuk pengaturan ekripsi yang kuat (ssl-params)
Next, kita akan
membuat konfigurasi snippet lain untuk mengamankan Nginx dengan SSL cipher
suite dan menambahkan fitur advance untuk menjaga server tetap secure. Gunakan
perintah berikut untuk membuat file snippet baru.
sudo nano
/etc/nginx/snippets/ssl-params.conf
Untuk set up
Nginx SSL yang aman, kita bisa mengambil rekomendasinya dari website Cipherlist.eu. Namun kita sedikit perubahan di bagian
resolver menjadi 8.8.8.8, 8.8.4.4 (dns google) dan menonaktifkan
Strict-transport-security dengan memberi tanda pagar / comment (#).
ssl_protocols TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_dhparam /etc/nginx/dhparam.pem;
ssl_ciphers EECDH+AESGCM:EDH+AESGCM;
ssl_ecdh_curve secp384r1;
ssl_session_timeout 10m;
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 strict transport security for now. You can uncomment the following
# line if you understand the implications.
#add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
Karena kita menggunakan self-signed certificate, SSL stapling tidak bisa digunakan. Nginx akan menampilkan pesan peringatan dan men-disable stapling untuk self-signed cert, tapi tenang web server akan tetap berjalan baik kok.
Langkah 3 – Mengubah konfigurasi Nginx untuk menggunakan SSL
Sekarang kita
gunakan file snippets yang dibuat pada langkah 2 untuk mengaktifkan konfigurasi
SSL di Nginx. Saya asumsikan teman-teman sudah mengerti apa itu server block di
Nginx, sudah melakukan perubahan defalut server block, dan menambahkan server
block baru. Jika belum mengerti silahkan klik disini.
Oke disini saya
memiliki file /etc/nginx/sites-available/defaults.blocks sebagai server blok
bawaan sudah di konfigurasikan untuk mendukung web berbasis PHP.
Untuk mengubah
web HTTP menjadi HTTPS kita hanya perlu melakukan perubahan pada script listen 80
menjadi listen 443 ssl dan menambahkan lokasi penyimpanan file certificate dan
key ssl, disini saya hanya perlu menambahkan lokasi file snippets. Jika sudah
di ubah tampilan atasnya akan menjadi seperti ini.
Nah untuk memastikan bahwa pengunjung web
kita, selalu mengakses website yang aman (web HTTPS).Pada baris paling bawah
tambahkan script server blocks baru, untuk meredirect (mengalihkan) setiap traffic
masuk ke web port 80, ke website HTTPS port 443.
Note !
Gunakan redirect 302 sampai terverifikasi semua
konfigurasi web berjalan dengan baik, setelah itu kamu bisa mengubah menjadi redirect
permanen dengan kode 301.
Kemudian kita lakukan uji / test apakah
konfigurasi server blocks nginx berhasil menggunakan perintah berikut.
sudo nginx -t
Jika berhasil akan muncul keterangan
seperti gambar dibawah, Syntax ok test Successful. Untuk peringatan ssl_stapling
di abaikan saja karena kita menggunakan Self-Signed SSL.
Setelah itu pastika semua perubahan dijalankan
dengan melakukan restart service Nginx.
sudo systemctl restart nginx
Langkah 4 – Uji coba akses website HTTPS
di Client
Search nama domain utama menggunakan protokol
https di browser, ex : https://srvabdultjkt.net
Akan muncul pesan peringatan seperti gambar
dibawah ini, karena certificate SSL yang kita punya tidak ditandatangani oleh
CA yang terpercaya dan dikenali oleh browser. Jika muncul gambar ini klik
Lanjutan / Advance.
Setelah itu klik Lanjutkan ke srvabdultjkt.net.
Sampai disini mungkin kamu bingung, katanya
SSL sudah aman tapi kok muncul pesan peringatan seperti diatas ? ..Tenang saja
kawan :D , pesan diatas muncul hanya karena certifcate SSL yang kita buat tidak valid
/ tidak diketahui otoritas penerbit Certificate (Certificate Authority) oleh
browser. Tapi tetap saja koneksi antara client dan server akan di enkripsi.
Tampilan web utama (HTTPS)
Langkah terakhir
kita uji coba untuk menguji redirect https dengan mengakses web utama
menggunakan protokol http/80 : http://srvabdultjkt.net,
Jika sudah berhasil kamu pasti akan langsung di arahkan ke website https/443.
Sertifikat SSL/TLS
yang sudah kita buat juga bisa digunakan ulang untuk web-web lain di web server
Nginx. Seperti membuat konfigurasi server block baru dengan mengarahkan sub-domain
tertentu ke dokumen root-nya, kamu tinggal mengubah listen ke 443, menambahkan
snippets ssl, dan meredirect request client. Seperti langkah ke-3 daiatas.
Selamat kamu sudah
berhasil melakukan konfigurasi Self-Signed SSL dan memasangnya di web server
Nginx !!!
0 Comments