Self Signed SSL Certificate

Apa itu SSL (Secure Socket Layer)? Meskipun mungkin terdengar asing, tetapi hampir setiap kita berinteraksi dengan dunia internet meskipun hanya dengan smartphone, kita tidak akan lepas dengan hal ini. SSL (Secure Socket Layer) adalah sebuah mekanisme standarisasi yang diterapkan untuk mengamankan komunikasi data yang terjadi setiap waktu di dunia internet. Jika kita membuka sebuah halaman website melalui sebuah browser (penjelajah web), pada bagian atas yang bertuliskan alamat situs URL, maka di sebelah kiri alamat tersebut, sering kita jumpai tulisan https:// dengan logo gembok di sampingnya. Itulah tandanya kita sedang melakukan komunikasi data menggunakan mekanisme SSL, mekanisme yang akan meng-enkripsi lalu lintas data dari dan ke web server yang bersangkutan.

Tanda bahwa website sudah menggunakan mekanisme SSL

Lalu apa itu SSL Certificate?πŸ”—

SSL Certificate sama halnya seperti ID Card, namun digunakan sebagai pengenal bagi sebuah website. Dengan SSL Certificate, maka kita bisa yakin bahwa segala bentuk komunikasi yang kita lakukan dengan website tersebut dilakukan dengan cara yang aman, serta betul-betul website yang kita kunjungi tersebut adalah website asli yang terhubung dengan nama domain yang bersangkutan.

Di dunia nyata, sebuah SSL Certificate diterbitkan oleh suatu lembaga yang terpercaya untuk menerbitkan dan memverifikasi keaslian SSL Certificate tersebut. Lembaga ini disebut sebagai Certificate Authority. Ada cukup banyak Certificate Authority atau kita singkat CA di seluruh dunia, sebagian besar kita harus membayar biaya penerbitan sebuah SSL Certificate yang berlaku untuk periode tertentu. Namun ada juga yang memberikan penerbitan SSL Certificate ini secara gratis, tapi hanya berlaku untuk masa 90 hari, dan setelahnya bisa di perpanjang lagi tanpa ada batasan berapa kali masa perpanjangan. CA ini cukup populer dan dikenal dengan nama LetsEncrypt.

Tampilan SSL Certificate asli untuk domain https://sif.my.id. Perhatikan pada bagian Issued by:

Self Signed SSL CertificateπŸ”—

Lalu, jika sudah ada CA resmi dan bahkan bisa memberikan SSL Certificate secara gratis, kenapa kita harus repot membuat dan memvalidasi sendiri sebuah SSL Certificate yang hanya berlaku untuk penggunaan di PC atau laptop milik kita pribadi saja? Alasan utama tentunya adalah soal kepraktisan dan kemudahan.

Saat kita dalam proses membuat dan membangun sebuah website atau aplikasi berbasis web, tentunya setelah jadi, aplikasi atau website tersebut akan di deploy di sebuah server dengan nama domain yang sudah ada sebelumnya. Otomatis ketika dalam proses pengembangan, nama domain yang digunakan pun seharusnya mencerminkan nama domain asli yang nantinya akan kita gunakan untuk aplikasi web kita. Dan agar nama domain serta website tersebut memiliki tingkat keamanan serta kepercayaan yang tinggi, harus juga dilengkapi dengan SSL Certificate. Dari sisi programmer atau developer, tentunya akan sangat memudahkan proses pembuatan website ketika lingkungan pemrograman yang kita pakai di PC atau laptop kita, bisa semirip mungkin dengan kondisi server tempat dimana nantinya aplikasi tersebut akan di deploy. Disinilah fungsi dari Self Signed SSL Certificate ini.

Fungsi yang lain adalah, kita bisa saja membuat satu SSL Certificate yang mencakup beberapa nama domain sekaligus. Sehingga untuk beberapa aplikasi yang kita kembangkan untuk melayani permintaan dari sejumlah pelanggan yang berbeda dan dengan nama domain yang berbeda pula, kita cukup menggunakan satu SSL Certificate yang sama.

Bagaimana implementasinya?πŸ”—

Secara garis besar, tahapan prosesnya akan seperti berikut:

  • PC atau laptop kita harus berpura - pura menjadi CA (Certificate Authority). dengan cara membuat sebuah SSL Certificate khusus untuk CA.
  • Setelahnya kita akan membuat sebuah SSL Certificate sendiri. Dalam tahap ini, SSL Certificate yang kita buat, belum tervalidasi, sehingga tidak bisa langsung digunakan.
  • Kita harus membuat sebuah permohonan validasi terhadap Certificate yang kita buat di tahap sebelumnya kepada CA yang juga kita buat sendiri di tahap pertama proses ini. Tahapan ini disebut sebagai Certificate Signing.
  • Baru setelahnya, SSL Certificate yang sudah di tanda tangani oleh CA milik kita sendiri, bisa digunakan dan dipasang pada web server lokal yang kita install di laptop atau PC kita.
  • Supaya kita bisa menjalankan web aplikasi yang kita develop menggunakan nama domain aslinya, kita setting file /etc/hosts dan menambahkan pada baris definisi localhost dengan menambahkan nama domain tersebut.
  • Agar SSL Certificate yang kita buat sendiri ini bisa dipercaya oleh browser, maka tahapan terakhir adalah mengenalkan SSL Certificate milik CA kepada database milik browser, yang kali ini akan kita gunakan adalah Chrome

Untuk menjalankan prosedur diatas, kita membutuhkan tools atau utility khusus yang bisa kita install dengan mudah di hampir semua distro Linux umumnya. Tools yang kita butuhkan adalah openssl. Jalankan command berikut di console:

$ sudo apt-get update
$ sudo apt-get install openssl
$ openssl version
OpenSSL 3.1.4 24 Oct 2023 (Library: OpenSSL 3.1.4 24 Oct 2023)

jika muncul info versi dan library seperti diatas, artinya tools openssl sudah terinstall dan siap digunakan. Namun karena command yang akan kita jalankan nantinya cukup banyak dan panjang, ada baiknya kita membuat sebuah bash script terlebih dulu, untuk kemudian memasukkan command - command tersebut kedalamnya.

Langkah awal, kita akan membuat sebuah folder baru, misalnya kita beri nama SSL-Cert.

$ mkdir SSL-Cert
$ cd SSL-Cert/
$ touch gen-cert.sh

kemudian, buka file gen-cert.sh dan tuliskan script berikut ke dalamnya, kemudian simpan.

#!/bin/bash

C=ID
ST="East Java"
L="Surabaya"
O="Sourabaya In Frame"
OU="IT Division"
CN=SIF
EMAIL="sourabayainframe2@gmail.com"
DAYS=3650
# add all domain names as necessary here
# must be in form of DNS:<FQDN> coma separated
# note that *.FQDN and FQDN treated as different value
ALT="DNS:sif.my.id,DNS:*.sif.my.id"

# create private key for CA
openssl genpkey -algorithm RSA -out ca.key

# create CA certificate with command line options
openssl req \
    -new \
    -x509 \
    -nodes \
    -key ca.key \
    -out ca.crt \
    -subj "/C=$C/ST=$ST/L=$L/O=$O/OU=$OU/CN=$CN/emailAddress=$EMAIL" \
    -addext "subjectAltName=$ALT"

# create private key for server
openssl genpkey -algorithm RSA -out server.key

# create CSR (Certificate Signing Request) for the server
openssl req \
    -new \
    -key server.key \
    -out server.csr \
    -subj "/C=$C/ST=$ST/L=$L/O=$O/OU=$OU/CN=$CN/emailAddress=$EMAIL" \
    -addext "subjectAltName=$ALT"

# sign the CSR by the CA, and the results is server certificate
openssl x509 \
    -req \
    -in server.csr \
    -CA ca.crt \
    -CAkey ca.key \
    -CAcreateserial \
    -out server.crt \
    -days $DAYS \
    -sha256 \
    -copy_extensions copy

# you can delete these files, they no longer needed
rm ca.key server.csr ca.srl

Sebelum menjalankan script diatas, jangan lupa untuk memberikan permission execute terhadap file gen-cert.sh dengan menjalankan command berikut:

$ chmod +x gen-cert.sh
(jalankan script dengan cara berikut:)
$ ./gen-cert.sh

jika berhasil, maka akan memberikan output seperti berikut:

...
...
Certificate request self-signature ok
subject=C = ID, ST = East Java, L = Surabaya, O = Sourabaya In Frame, 
OU = IT Division, CN = SIF, emailAddress = sourabayainframe2@gmail.com

dan di dalam folder SSL-Cert, akan muncul beberapa file seperti berikut:

SSL-Cert/
β”œβ”€β”€ ca.crt
β”œβ”€β”€ gen-cert.sh <== (script yang kita buat)
β”œβ”€β”€ server.crt
└── server.key

Perhatikan bahwa hasil akhirnya akan terdapat 3 file baru yaitu:

  • ca.crt: File CA Certificate yang nantinya akan di import ke database Authorized Certificate Authority di browser yang kita gunakan. Selain itu, file ini juga perlu di register-kan dan diaktifkan di sistem pengelolaan CA Certificate yang ada di OS Linux yang kita gunakan. Untuk Debian GNU/Linux serta distro linux berbasis Debian lainnya semisal Ubuntu, pastikan sudah terinstall paket ca-certificates. Jika belum ada, silakan di install lebih dulu dengan command:
$ sudo apt-get install ca-certificates
$ apt-show-versions ca-certificates
(hasilnya akan muncul seperti berikut:)
ca-certificates:all/sid 20230311 uptodate
(buat folder baru dengan nama semisal SIF di dalam
folder /usr/share/ca-certificates)
$ sudo mkdir /usr/share/ca-certificates/SIF
(copy file ca.crt ke folder tersebut)
$ sudo cp ca.crt /usr/share/ca-certificates/SIF/

Kemudian, agar file CA Certificate kita yang baru tersebut dikenali oleh sistem OS kita, terlebih dulu harus kita masukkan kedalam file konfigurasi yang ada di /etc/ca-certificates.conf

$ sudo nano /etc/ca-certificates.conf
(tambahkan pada baris paling bawah: "SIF/ca.crt", lalu simpan)
(kemudian jalankan command berikut:)
$ sudo update-ca-certificates
  • server.key, server.crt: 2 file ini yang akan kita konfigurasikan di dalam setting web browser yang kita install di dalam laptop atau PC lokal kita. Untuk cara setting dan konfigurasi, tergantung masing - masing web server yang kita gunakan, disini kita akan mencontohkan menggunakan nginx.

Terlebih dulu, copy kan folder SSL-Cert yang terdapat kedua file tadi kedalam folder /etc/ssl/. Sehingga posisi akhir file tersebut ada dalam folder path /etc/ssl/SSL-Cert/. Kemudian tambahkan 2 baris konfigurasi berikut kedalam definisi web server nginx untuk vhost yang bersangkutan, semisal: /etc/nginx/sites-enabled/sif.my.id. Sehingga file konfigurasi akan nampak seperti berikut:

...
...
server {
    listen 443 ssl;
    listen [::]:443 ssl;
    # 2 baris berikut untuk menggunakan SSL certificate 
    # yang kita buat sebelumnya
    ssl_certificate /etc/ssl/SSL-Cert/server.crt;
    ssl_certificate_key /etc/ssl/SSL-Cert/server.key;
    server_name sif.my.id;
    root /var/www/sif.my.id/html;
    index index.html index.htm index.nginx-debian.html;
}
...
...
(untuk baris konfifurasi yang lain, sesuaikan dengan kebutuhan)

Setelahnya, lakukan restart atau reload terhadap nginx server dengan menjalankan:

$ sudo systemctl restart nginx

Satu lagi, sebelum kita bisa mengakses website yang kita setting sebelumnya menggunakan nginx dengan nama domain aslinya (https://sif.my.id), kita harus menambahkan nama domain tersebut di dalam file /etc/hosts, sehingga menjadi seperti berikut:

$ sudo nano /etc/hosts
127.0.0.1 localhost sif.my.id
...
...
(simpan, kemudian lakukan tes berikut:)
$ ping sif.my.id
PING localhost (127.0.0.1) 56(84) bytes of data.
64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.094 ms
64 bytes from localhost (127.0.0.1): icmp_seq=2 ttl=64 time=0.107 ms
64 bytes from localhost (127.0.0.1): icmp_seq=3 ttl=64 time=0.102 ms
64 bytes from localhost (127.0.0.1): icmp_seq=4 ttl=64 time=0.105 ms
64 bytes from localhost (127.0.0.1): icmp_seq=5 ttl=64 time=0.108 ms
(terlihat bahwa meskipun kita ping ke sif.my.id, jawaban yang diterima
berasal dari 127.0.0.1 atau localhost. Berarti setting yang kita lakukan
sudah benar.)

Namun, jika kita membuka website tersebut menggunakan browser, dalam hal ini kita menggunakan chrome, maka akan muncul peringatan seperti berikut:

Browser masih belum `mempercayai` CA Certificate yang kita buat

The Final StepπŸ”—

Dari sekian banyak langkah dan proses yang telah kita lakukan, ternyata masih belum cukup untuk bisa membuka website kita menggunakan metode SSL, dan browser masih belum percaya sepenuhnya dengan sertifikat SSL yang kita buat sendiri untuk kebutuhan lokal di laptop atau PC kita. Untuk itu, perlu ada satu tahapan lagi yang menentukan, kita harus melakukan import CA Certificate yaitu file ca.crt ke dalam Trust List database di browser yang kita gunakan. Caranya, ikuti tahapan langkah berikut:

  • Buka alamat url chrome://settings pada browser chrome kita
  • Pada menu sebelah kiri, klik menu Privacy and Security, maka akan tampil halaman setting seperti berikut:
    Di halaman ini, pilih pada menu `Security`
  • Kemudian pada halaman setting Security yang tampil, scroll kebawah hingga muncul pilihan menu seperti berikut:
    Pilih pada menu `Manage device certificates
  • Pada halaman menu selanjutnya, pilih pada tab Authorities. Kemudian klik tombol Import, dan browse hingga ketemu file ca.crt di folder SSL-Cert, klik Open, maka akan muncul window dialog seperti berikut:
    Centang pada pilihan: Trust this certificates for identifying websites
    dan klik tombol OK
  • Tutup window browser chrome, kemudian jalankan kembali. Dan kali ini ketika kita membuka alamat Url https://sif.my.id maka pesan error tidak akan muncul, dan logo gembok di depan alamat url akan tampil.

Untuk meyakinkan bahwa SSL Certificate yang digunakan oleh website kita sudah diterima dan berhasil di daftarkan pada Trust list oleh browser, klik pada logo gembok, kemudian pilih menu Connection is secure. Kemudian pada window yang muncul, pilih Certificate is valid seperti pada gambar berikut:

Pilih pada menu `Certificate is valid` untuk menampilkan detail SSL

maka akan muncul window seperti pada gambar pertama pada artikel ini. Namun jika kita perhatikan secara seksama, dibagian Issued by disitu akan menampilkan informasi mengenai CA (Certificate Authority) yang bertuliskan informasi bahwa CA yang digunakan adalah CA yang kita buat sendiri pada tahap sebelumnya, bukan lagi CA resmi Let’s Encrypt.

Perhatikan pada bagian `Issued by` sekarang menjadi Sourabaya In Frame

Sampai ditahap ini, berarti proses pembuatan Self Signed SSL Certificate sudah berhasil dan berjalan dengan benar. Sertifikat SSL ini memiliki masa berlaku hingga 10 tahun (3650 hari), sesuai dengan setting yang kita buat. Simpan dengan baik folder SSL-Cert dan file yang ada di dalamnya, karena bisa kita gunakan kembali di laptop maupun PC lain yang kita gunakan untuk men-develop website dengan nama domain serta subdomain sif.my.id lainnya.

by: @adymulianto