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.
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.
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 definisilocalhost
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 paketca-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 menggunakannginx
.
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:
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: - Kemudian pada halaman setting
Security
yang tampil, scroll kebawah hingga muncul pilihan menu seperti berikut: - Pada halaman menu selanjutnya, pilih pada tab
Authorities
. Kemudian klik tombolImport
, dan browse hingga ketemu fileca.crt
di folderSSL-Cert
, klik Open, maka akan muncul window dialog seperti berikut: dan klik tombolOK
- 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:
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.
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