Konfigurasi Self-Signed SSL di NGINX

 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;

Save & Exit.
  • 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 !!!

Wassalamualaikum wr.wb.

Referensi : 

Post a Comment

0 Comments