Tuesday, December 31, 2019

Konfigurasi SSL Web Menggunakan Lets Encrypt

Pada catatan saya kali ini, saya akan menggunakan docker, namun secara logic, implementasinya seharusnya tidak beda dengan anda mengeksekusi langsung di host. Bagian yang saya tebalkan adalah value atau variabel yang dapat disesuaikan dengan kebutuhan anda, sehingga tidak selalu harus bernilai sama.


Environment :
OS : Ubuntu Server 18.04 LTS
Docker : Docker version 18.09.7, build 2d0083d
Nginx : 1.17.10
Dependensi dan versi yang saya gunakan :
- git versi 2.20.1
- certbot versi terakhir
Semua command yang saya tuliskan menggunakan user root, bagi anda yang tidak menggunakan user root, pastikan user anda dapat menggunakan perintah sudo. Dan perlu di ingat, bila anda menggunakan sudo, maka setiap perintah disini wajib ditambahkan sudo di depannya.

Pertama, kita siapkan folder untuk volume webserver kita. Kali ini saya menggunakan directory /root/webserver sebagai folder volume untuk container webserver. Folder volume bisa di sesuaikan kebutuhan.
docker run -it --rm \
-v /root/webserver/htdocs/:/usr/share/nginx/html \
-v /root/webserver/etc/nginx:/etc/nginx \
nginx true
Setelah itu bisa kita cek apakah folder volume yang dibutuhkan sudah terbentuk atau belum. Hasil pengecekan kurang lebih terlihat seperti gambar


Selanjutnya copy config nginx yang ada dalam image, ke folder volume yang sudah terbentuk. Jika kita tidak mengcopy config tersebut, lalu kita menggunakan volume untuk config nginx, maka besar kemungkinan nginx akan crash dan tidak dapat berjalan. untuk mengcopy config tersebut, kita bisa gunakan perintah sebagai berikut :
docker run -it --rm \
-v /root/webserver/etc/nginx/:/target  \
nginx cp -arvf /etc/nginx/. /target
Dari gambar bisa kita lihat, config nginx sudah tercopy ke directory volume nginx. Selanjutnya kita perlu sedikit mengubah config pada nginx. Sebenarnya ini bersifat opsional, tapi alangkah lebih baik jika kita tambahkan. Saya menggunakan teks editor nano, anda bisa menggunakan teks editor lain seperti pico, vi/vim, atau neovim.
nano webserver/etc/nginx/conf.d/default.conf 
Kemudian sesuaikan line pertama pada config tersebut, di bagian yang saya tebali silahkan anda ganti dengan domain webserver anda 
server {
    listen       80;
    server_name  registry.bukananakit.com;
Kalau sudah, kita bisa mulai run mulai mendeploy nginx webserver. Karena goal kita adalah memasang SSL dari letsencrypt, maka kita perlu menambahkan directory /etc/letsencrypt ketika mendeploy nginx webserver. Pastikan port 80 dan 443 tidak digunakan saat anda mendeploy container. Untuk perintah nya sebagai berikut :
docker run -d --net=host \
--hostname webserver \
--name webserver \
-v /root/webserver/htdocs/:/usr/share/nginx/html \
-v /root/webserver/etc/nginx:/etc/nginx \
-v /etc/letsencrypt/:/etc/letsencrypt/ \
nginx
Kemudian pastikan container nginx sudah running. Kita bisa cek dengan perintah :
docker ps


Selanjutnya cek via browser, sesuikan dengan domain anda, kalo saya berarti http://registry.bukananakit.com. Hasilnya mungkin awalnya akan terlihat seperti ini

Mengapa begitu? karena di root folder webserver kita belum menempatkan file apapun. Untuk sederhananya, kita bisa mengisi folder tersebut menggunakan perintah berikut :
echo "<h3>Its Working</h3>" > webserver/htdocs/index.html
Kemudian kita tinggal refresh halaman tadi, dan seharusnya muncul output sebagai berikut:

Oke, webserver sudah ready, saat nya memasang SSL menggunakan letsencrypt. Pastikan git sudah terinstall di server anda. Untuk directory certbot, saya menggunakan directory /opt/certbot. Directory ini bisa diganti sesuai dengan kebutuhan. Pertama, kita clone terlebih dahulu certbot dengan perintah berikut:
git clone https://github.com/certbot/certbot /opt/certbot

Selanjutnya kita run command berikut (sesuaikan value yang ada di command dengan kebutuhan anda) :

/opt/certbot/certbot-auto certonly --non-interactive \
--webroot -d registry.bukananakit.com \
-w "/root/webserver/htdocs" \
--agree-tos \
--email "admin@bukananakit.com"
Certbot akan merefresh repo dan menginstall dependensi yang dia perlukan. output (karena panjang saya potong) dari dependensi kurang lebihnya akan seperti berikut :

Kemudian jika sudah selesai, akan terlihat seperti gambar berikut :

Bisa kita lihat, proses menginstall SSL dengan letsencrypt sudah berhasil (jika output berbeda, mungkin proses install belum berhasil). Terdapat beberapa "Important Notes" yang perlu kita cermati, beberapa diantaranya adalah :
1. certificate ssl terletak di directory:
/etc/letsencrypt/live/registry.bukananakit.com/fullchain.pem
2. certificate ssl terletak di directory:
/etc/letsencrypt/live/registry.bukananakit.com/privkey.pem
3. config  account certbot terletak di directory:
/etc/letsencrypt/

4. SSL akan kadaluarsa pada :  2020-07-18


Nah, kita sudah mendapatkan SSL dengan letsencrypt. Selanjutnya kita akan menginstall SSL tersebut ke webserver nginx yang sudah kita deploy. Kita perlu terlebih dahulu menambahkan config https di nginx. Kita akan menambahkan config yang sudah kita buat tadi. Kembali silahkan gunakan teks editor favorit anda.
nano webserver/etc/nginx/conf.d/default.conf

Kemudian tambahkan config berikut, di bagian paling bawah. jangan lupa sesuaikan dengan directory yang anda gunakan:

server {
        listen 443 ssl http2; # by default, its used 443        
        listen [::]:443 ssl http2; # by default, its used 443

        server_name         registry.bukananakit.com; 

 location / {
  root   /usr/share/nginx/html;
  index  index.html index.htm;
 }


        ssl_certificate     /etc/letsencrypt/live/registry.bukananakit.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/registry.bukananakit.com/privkey.pem;

        ssl_session_timeout 1d;
        ssl_session_cache shared:MozSSL:10m;  # about 40000 sessions

        # intermediate configuration
        ssl_protocols TLSv1.2 TLSv1.3; # adjust your protocol here 
        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;
        ssl_prefer_server_ciphers off;

}

 Kurang lebih terlihat sebagai berikut :


Selanjutnya kita cek, apakah config yang kita buat sintaksnya sudah sesuai atau belum. Kita bisa menggunakan perintah :
docker exec -it webserver nginx -t
Bila tidak ada kesalahan, output yang dihasilkan akan terlihat seperti berikut :


Selanjutnya kita restart docker container nginx dengan perintah :
docker restart webserver 
Pastikan container webserver running. kemudian kita bisa cek SSL melalui browser dengan mengakses https://registry.bukananakit.com. bagi yang menggunakan firefox, seharusnya kita bisa melihat tanda kunci warna hijau di sebelah URL,

Dan kalau kita cek, maka certificate akan terlihat seperti pada gambar berikut:

Saya menulis beberapa cheat sheet nginx config. Silahkan bagi yang membutuhkannya bisa di akses disini. disini.

Semoga bermanfaat.

Referensi :

No comments:

Post a Comment