WordPress-Nginx : Let’s Encrypt SSL Dan Konfigurasi HTTPS + HTTP/2

Posted by

Setelah anda install wordpress di Nginx, hal selanjutnya yang perlu anda lakukan adalah mengamankan komunikasi antara browser visitor dan server anda menggunakan SSL (https).

Tidak bisa di pungkiri bahwa menggunakan protokol HTTPS membuat komunikasi data lebih lambat daripada menggunakan protokol HTTP.

Sehingga walaupun saat ini sudah ada SSL gratis tetap saja masih banyak yang belum menggunakan protokol HTTPS.

Untuk mengatasi hal tersebut kita akan menggunakan HTTP/2 sebagai booster performa dari HTTPS.

HTTP/2 merupakan versi terbaru dari protokol HTTP yang hanya bisa di implementasikan pada jalur komunikasi HTTPS.

SSL Gratis Dari Let’s Encrypt

Pada artikel kali ini saya akan menginstall sertifikat SSL gratisan dari Let’s Encrypt yang mana sudah lebih dari cukup untuk mengenkripsi komunikasi data web anda.

Namun jika web anda bergerak di bidang eCommerce, maka lebih baik menggunakan SSL yang berbayar.

Kenapa?

Karena SSL berbayar selain mengenkripsi mereka juga memberikan garansi terhadap konsumen kita jika terjadi kebocoran data.

Install Certbot

Saya akan menggunakan certbot untuk mendapatkan sertifikat SSL Let’s Encrypt.

Sebelum melakukan instalasi, tambahkan repo certbot terlebih dahulu menggunakan command berikut ini.

  • Ubuntu 18.04 Bionic
    
    sudo add-apt-repository ppa:certbot/certbot
    sudo apt-get update
     
  • Debian 9 Stretch
    
    echo "deb http://cdn-fastly.deb.debian.org/debian stretch-backports main contrib non-free" | sudo tee -a /etc/apt/sources.list
    echo "deb-src http://cdn-fastly.deb.debian.org/debian stretch-backports main contrib non-free" | sudo tee -a /etc/apt/sources.list
    sudo apt-get update
     

Setelah anda menambahkan repository, install certbot dengan command berikut.

  • Ubuntu 18.04 Bionic
    
    sudo apt-get install python-certbot-nginx
     
  • Debian 9 Stretch
    
    sudo apt-get install python-certbot-nginx -t stretch-backports
     

Install Let’s Encrypt

Untuk mendapatkan sertifikat SSL Let’s Encrypt, ketik command berikut di shell linux anda.

  • Ubuntu 18.04 Bionic
    
    sudo certbot --nginx certonly
     
  • Debian 9 Stretch
    
    sudo certbot certonly --authenticator standalone --pre-hook "nginx -s stop" --post-hook "nginx"
     

Lalu akan muncul beberapa input form yang bisa anda lihat pada contoh berikut ini.

sudo certbot --nginx certonly
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator nginx, Installer nginx
Enter email address (used for urgent renewal and security notices) (Enter 'c' to
cancel): testes@omgoblog.com

Pertama anda diminta untuk mengisi alamat email anda.

Masukkan alamat email anda untuk mendapatkan notifikasi pembaharuan dan keamanan.


- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must
agree in order to register with the ACME server at
https://acme-v02.api.letsencrypt.org/directory
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(A)gree/(C)ancel: A

Selanjutnya adalah section agreement Let’s Encrypt. Jika anda berniat melanjutkan, maka anda harus menyetijui agreement tersebut dan masukkan A sebagai jawaban.


- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Would you be willing to share your email address with the Electronic Frontier
Foundation, a founding partner of the Let's Encrypt project and the non-profit
organization that develops Certbot? We'd like to send you email about our work
encrypting the web, EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: Y

Selanjutnya adalah pertanyaan apakah anda bersedia untuk membagikan alamat email di atas ke Electronic Frontier Fondation yang merupakan partner dari Let’s Encrypt.

Saya paribadi menjawab Y, karena siapa tau informasi yang di bagikan menarik dan informatif.

Seandainya tidak menarik atau bahkan mengganggu, kita bisa unsubscribe nantinya.


Which names would you like to activate HTTPS for?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: omgoblog.com
2: www.omgoblog.com
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate numbers separated by commas and/or spaces, or leave input
blank to select all options shown (Enter 'c' to cancel): 1

Berikutnya akan tampil domain yang terasosiasi dengan server anda. Silahkan anda pilih domain mana yang ingin anda aplikasikan sertifikat Let’s Encrypt.

Anda bisa memilih lebih dari satu, sebagai contoh tampilan di atas, jika anda ingin memilih kedua domain tersebut, maka input dengan angka 1,2.

KArena saya hanya ingin sertifikat Let’s Encrypt di domain omgoblog.com maka saya menginput 1.


Obtaining a new certificate
Performing the following challenges:
http-01 challenge for omgoblog.com
Waiting for verification...
Cleaning up challenges

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/omgoblog.com/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/omgoblog.com/privkey.pem
   Your cert will expire on 2018-12-13. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot
   again. To non-interactively renew *all* of your certificates, run
   "certbot renew"
 - Your account credentials have been saved in your Certbot
   configuration directory at /etc/letsencrypt. You should make a
   secure backup of this folder now. This configuration directory will
   also contain certificates and private keys obtained by Certbot so
   making regular backups of this folder is ideal.
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

Selanjutnya adalah proses untuk mendapatkan sertifikat SSL dari Let’s Encrypt. Jika berhasil maka anda akan melihat tampilan seperti di atas.

Lalu pada section Important Notes jangan lupa untuk mencatat informasi sertifikat yang saya BOLD di atas, yang mana akan di gunakan untuk konfigurasi Nginx.

Informasi tersebut adalah sebagai berikut.

  • SSL Certificate :  /etc/letsencrypt/live/omgoblog.com/fullchain.pem
  • SSL Certificate Key :  /etc/letsencrypt/live/omgoblog.com/privkey.pem

Update Let’s Encrypt Certificate

Sertifikat SSL dari Let’s Encrypt hanya berlaku selama 90 hari, sehingga anda harus melakukan update sertifikat setiap 90 hari.

Untuk mengupdate sertifikat Let’s Encrypt anda bisa menggunakan command berikut ini.


sudo certbot renew --dry-run
 

Diffie-Hellman Parameter

Untuk lebih meningkatkan keamanan, saya akan mengaplikasikan forward secrecy menggunakan Diffie-Hellman Parameter dengan cara di bawah ini.

Pertama, kita masuk ke dalam folder /etc/ssl/certs terlebih dahulu.


cd /etc/ssl/certs
 

Setelah itu generate dhparams menggunakan openssl dengan command  berikut.


openssl dhparam -out dhparam.pem 4096
 

Selanjutnya kita perlu menginformasikan Nginx untuk menggunakan dhparams dengan melakukan konfigurasi berikut ini.


ssl_dhparam /etc/ssl/certs/dhparam.pem;
 

Konfigurasi lengkap bisa anda lihat pada poin konfigurasi di bawah.

Konfigurasi Nginx

Konfigurasi ini akan melanjutkan konfigurasi yang telah kita lakukan pada artikel sebelumnya mengenai cara install WordPress di Nginx.

Oleh sebab itu kita akan membuat satu file konfigurasi lagi untuk SSL di folder global sebagai berikut.


sudo touch /etc/nginx/global/ssl.conf
 

1.  File ssl.conf

Buka file ssl.conf yang telah kita buat di atas.


sudo nano /etc/nginx/global/ssl.conf
 

Selanjutnya saya akan mengisi konfigurasi berikut ini ke dalam file tersebut.

a.  SSL Protocol

Untuk SSL protokol saya akan menggunakan protokol dari TLS karena protokol SSLv3 dan sebelumnya memiliki celah keamanan yang sangat rentan.

Saat ini, versi openssl yang ada di Ubuntu 18.04 package masih versi 1.1.0, yang mana belum mendukung TLSv1.3 sehingga saya akan menggunakan protokol TLSv1.2 sambil menanti release openssl 1.1.1 dari Ubuntu 18.04 package.


ssl_protocols TLSv1.2;
 

Jika anda tetap ingin menggunakan TLSv1.3, anda bisa mengcompile openssl 1.1.1 secara manual terlebih dahulu.

b.  Ciphers

Ciphers digunakan untuk menentukan tipikal enkripsi yang akan digunakan antara client browser dan server.

Konfigurasi Cipher yang saya gunakan adalah sebagai berikut.


ssl_ciphers ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-CHACHA20-POLY1305:ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384;
ssl_prefer_server_ciphers on;
 

c.  ECDH Curve

SSL ECDH Curve merupakan suatu elliptical curve yang akan digunakan untuk ECDHE Ciphers. Secara default Nginx menggunakan konfigurasi auto untuk mencari elliptical curve yang bisa di gunakan.

Untuk mengoptimalkannya, maka saya akan membatasi pilihan elliptical curve tersebut sebagai berikut.


ssl_ecdh_curve secp384r1:secp521r1;
 

d.  Session Cache

Agar proses renegosiasi SSL tidak berjalan terus menerus setiap ada request, maka kita perlu melakukan session cache pada proses tersebut.

Untuk melakukan session cache anda bisa menggunakan konfigurasi berikut ini.


ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_session_tickets off;
 

ssl_session_cache shared:SSL:10m; mengindikasikan kalau sistem cache akan di handle oleh Nginx yang mana lebih efisien daripada openssl cache, dengan kapasitas cache sebesar 10 MB.

ssl_session_timeout 10m; menandakan berapa lama cache di simpan.

ssl_session_tickets secara default ada dalam kondisi on, yang berarti session tickets akan terbentuk setelah terjadi negosiasi antara client dan server yang selanjutnya session tersebut disimpan dan di enkripsi untuk koneksi selanjutnya. Sistem session resumption ini memang akan membuat performa lebih cepat, namun menurut Mozilla hal tersebut bisa menimbulkan security risk. Selain itu sistem perfect forward secrecy menjadi useless jika ssl session tickets dalam kondisi aktif. Oleh sebab itu saya set dalam kondisi off agar sistem perfect forward secrecy bisa berfungsi sebagaimana mestinya.

e.  OCSP Stapling

Untuk menentukan suatu sertifikat valid atau tidak, maka web server perlu untuk melakukan validasi ke server penerbit sertifikat tersebut.

Bayangkan jika tiap koneksi terjadi dengan skema di atas, maka browser client / visitor memerlukan waktu lebih lama untuk menunggu respon dari server kita, karena server perlu melakukan validasi terlebih dahulu.

Oleh sebab itu sebelumnya saya katakan jika koneksi HTTPS lebih lambat di bandingkan HTTP.

Untuk mengatasi hal tersebut kita bisa mengimplementasikan OCSP Stapling, yaitu suatu metode agar web server bisa melakukan query OCSP responder dan men-cache responnya.

Untuk mengaktifkan OCSP Stapling di Nginx maka anda perlu melakukan konfigurasi berikut ini.


ssl_stapling on;
ssl_stapling_verify on;

f. Full Config

Secara keseluruhan anda bisa melihat file ssl.conf sebagai berikut.


# ssl protocol
ssl_protocols TLSv1.2 TLSv1.3;

# Ciphers
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384;
ssl_prefer_server_ciphers on;

# ECDH Curves
ssl_ecdh_curve secp384r1:secp521r1;

# Session Cache
ssl_session_cache shared:SSL:10m;
ssl_session_timeout  10m;
ssl_session_tickets off;

# Diffie-Hellman Parameter
ssl_dhparam /etc/ssl/certs/dhparam.pem;

# OCSP Stapling
ssl_stapling on;
ssl_stapling_verify on;
 

2.  File omgoblog.conf

a.  HTTPS dan HTTP/2

Supaya web kita bisa mengimplementasikan HTTPS dan HTTP/2 maka kita perlu melakukan konfigurasi pada block server sebagai berikut.


listen 443 ssl http2;
listen [::]:443 ssl http2;
 

b.  File Sertifikat

Selanjutnya kita perlu menginformasikan Nginx lokasi dari file sertifikat Let’s Encrypt.


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

c.  HSTS Header

Untuk meningkatkan keamanan, kita perlu menambahkan header yang mengindikasikan jika browser hanya bisa berkomunikasi dengan server melalui HTTPS.


add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";
 

d.  File Konfigurasi SSL

Selanjutnya kita perlu menginformasikan lokasi dari file konfigurasi SSL yang telah kita buat pada poin di atas sebagai berikut.


include global/ssl.conf;
 

e.  HTTPS Redirection

Walaupun kita telah menambahkan header HSTS, ada beberapa browser yang belum mengimplementasikan header tersebut.

Oleh sebab itu untuk meningkatkan compatibility, kita perlu mengkonfigurasi redirection sebagai berikut.


server {
listen 80;
listen [::]:80;
server_name omgoblog.com www.omgoblog.com;
return 301 https://omgoblog.com$request_uri;
}
 

f.  Redirect ke non-www

Pada artikel sebelumnya kita telah mengkonfigurasi redirect dari www ke non-www, namun dengan protokol HTTP.

Untuk protokol HTTPS, maka kita perlu ubah sebagai berikut.


server {
listen 443;
listen [::]:443;
server_name www.omgoblog.com;
return 301 https://omgoblog.com$request_uri;
}
 

3.  Restart Nginx

Setelah melakukan konfigurasi di atas, pastikan kalau tidak ada error pada konfigurasi Nginx anda.

sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
 

Setelah semua oke, jangan lupa untuk merestart Nginx service.


sudo service nginx restart
 

CONCLUSSION

Konfigurasi yang saya lakukan di atas merupakan best approach sementara saat ini.

Masih banyak ruang untuk melakukan optimalisasi, oleh sebab itu artikel ini juga akan saya update jika saya memperoleh best approach yang lebih baik.

Mungkin anda juga pernah mendengar Public Key Pinning (HPKP), namun saya tidak membahasnya pada artikel ini.

Hal tersebut karena konfigurasi HPKP sangat riskan dan jika ada kesalahan maka website anda tidak akan bisa di akses oleh user dalam jangka waktu yang cukup lama.

Saya pernah mengalami hal tersebut, dimana saya mengkonfigurasi HPKP dengan waktu cache selama dua tahun.

Masalah datang ketika saya lupa memperpanjang / renew sertifikat ssl saya, dan saya pun menggunakan sertifikat ssl yang baru.

Website saya tersebut pun tidak bisa di akses karena ulah dari HPKP ini.

Dan yang lebih menyedihkan, saya harus menunggu hingga waktu cache berakhir yang saat itu mungkin masih sekitar ~ 1,5 tahun lagi. yikes!!

Solusi tentu ada, namun saya yakinkan anda kalau waktu dan tenaga yang anda curahkan tidak sebanding dengan hasilnya. Too much effort for solving problem caused by one optional thing!

Saat itu pun saya hanya ‘kebetulan’ bisa merecovery akses situs tersebut, walaupun tidak 100% recover.

Akhir kata, selamat menikmati jalur komunikasi yang lebih aman menggunakan protokol HTTPS.

One comment

  1. Sore mas, saya ada masalah sama file upload di wordpress, kadang bisa kadang tidak, dan kadang saya config ulang lancar gak ada masalah, terus saya reset lagi install lagi ada masalah lagi, saya pakai ssl mas, karna sudah saya coba tanpa ssl lancar saja. dan post, upload (php.ini) , client_max (nginx.conf) size nya sudah saya samakan jadi 64.

    pusing euy.

Leave a Reply

Your email address will not be published. Required fields are marked *