Yak yang pusing liat codingan atau yang nggak mengerti bahasa-bahasa di dunia IT silahkan pindah ke page lain ya karena postingan ini bakal agak teknikal. Gw pernah nulis tutorial semacam ini di post sebelumnya dibilang bahasa alien OMG hahaha. gapapa, siapa tau kan dengan gw nulis ini makin banyak orang yang tertarik belajar bahasa alien ini, karena masa depan teknologi kedepan pasti dimotori oleh jutaan baris bahasa alien ini. Jadi, yuk dimulai.

Apaan sih SSL

SSL (Secure Socket Layer) sendiri adalah lapisan yang memberikan rasa aman untuk segala proses input output di website dengan teknologi enkripsi data yang canggih. Pada website dengan SSL maka alamatnya berubah menjadi https dan muncul tanda padlock (gembok) di address bar browser yang bisa di-klik untuk melihat jenis SSL, teknologi enkripsi yang dipakai dan siapa identitas pemilik website. Gampangnya kalau di url nya diawali dengan https nah itu sudah secured artinya. Kalau website anda belum bisa https, nah saatnya dicoba tutorial ini.

Kegunaannya apa sih dipasang SSL ?
  • Meningkatkan kepercayaan pengunjung website
  • Mengamankan transaksi yang ada di website dengan enkripsi termasuk data kartu kredit, password, dll.
  • Website yang menggunakan SSL/HTTPS mendapatkan ranking SEO yang lebih baik dari Google dibanding dengan website yang tidak diproteksi dengan SSL.
  • Berhak menampilkan SSL Secured Seal di website.
  • Biar keren, ada gembok ijo dan securednya.
  • Biar nggak diisengin orang atau di hack orang

Tutorial

Sebelum dimulai tutorialnya, hendaknya berdoa dulu biar nggak ada hal-hal yang tidak diinginkan terjadi, semoga semuanya berjalan lancar dari awal hingga akhir. Setelah berdoa, nah cek lagi bahwa tutorial ini ditujukan untuk OS Ubuntu, dan untuk Nginx. Jadi yang pakai server lain seperti apache dll dengan berat hati gw ga memasukkan di tutorial ini karena memang nggak pakai. Semoga ketemu tutorialnya di link lain ya.

Let's Encrypt

Tutorial memasang SSL ini akan menggunakan "Let's Encrypt" sebagai Certificate Authority (CA) yang menyediakan cara mudah untuk memasang sertifikat TLS/SSL secara gratis. Soalnya aslinya memang harus bayar, tapi pasti kalian seneng yg gratis kan, sama, penulis juga seneng, jadi kita pakai yg gratisan saja.

Sebelumnya, coba cek A Record domain kalian, harus ada 2 record yang kosong dan www yang semuanya pointing ke public url.

Yuk Mulai

Step 1 . Instal certbot

Langkah pertama untuk menggunakan "Let's Encrypt" untuk mendapatkan sertifikat SSL adalah dengan install certbot di server.

$ sudo add-apt-repository ppa:certbot/certbot

$ sudo apt-get update

$ sudo apt-get install certbot

Sekarang certbot Let's Encrypt sudah siap digunakan.

Step 2 — Mendapatkan Sertifikat

Let's Encrypt menyediakan berbagai macam cara untuk mendapatkan sertifikat SSL, nah salah satunya gw akan menggunakan Webroot plugin untuk mendapatkannya.

Webroot Plugin

Plugin Webroot bekerja dengan membuat direktori baru /.well-known pada root yang bisa diakses oleh Let's Encrypt untuk validasi.

Kalau belum pernah install nginx, bisa menjalankan perintah ini dulu
sudo apt-get install nginx

Lalu kita rubah konfigurasi dari nginx nya,
sudo nano /etc/nginx/sites-available/default

lalu di bagian server ditambah 3 baris dibawah yang location /.well-known

    server {
           . . .

           location ~ /.well-known {
                 allow all;
           }
           . . .
    }

Save dan exit.

Cek konfigurasinya apakah ada syntax error
sudo nginx -t

Restart Nginx
sudo service nginx restart

Sekarang kita jalankan certbotnya
sudo certbot certonly --webroot --webroot-path=/var/www/html -d example.com -d www.example.com

itu diganti ya example.com sama www.example.com jadi domain name kalian.

outputnya kalau sukses akan keluar seperti ini

    IMPORTANT NOTES:
     - Congratulations! Your certificate and chain have been saved at
       /etc/letsencrypt/live/example.com/fullchain.pem. Your cert
       will expire on 2017-07-26. 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"
     - If you lose your account credentials, you can recover through
       e-mails sent to sammy@example.com.
     - 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

Certificate Files

Setelah itu kalian akan mendapatkan 4 file .pem yaitu

  • cert.pem: Your domain's certificate
  • chain.pem: The Let's Encrypt chain certificate
  • fullchain.pem: cert.pem and chain.pem combined
  • privkey.pem: Your certificate's private key

Yang keberadaannya bisa di cek dengan menjalankan
sudo ls -l /etc/letsencrypt/live/your_domain_name

domain name diganti dengan nama domain kalian misal ariadiprana.com

outputnya akan keluar seperti ini :

    lrwxrwxrwx 1 root root  39 Jun 26 08:33 cert.pem -> ../../archive/ariadiprana.com/cert1.pem
    lrwxrwxrwx 1 root root  40 Jun 26 08:33 chain.pem -> ../../archive/ariadiprana.com/chain1.pem
    lrwxrwxrwx 1 root root  44 Jun 26 08:33 fullchain.pem -> ../../archive/ariadiprana.com/fullchain1.pem
    lrwxrwxrwx 1 root root  42 Jun 26 08:33 privkey.pem -> ../../archive/ariadiprana.com/privkey1.pem
    -rw-r--r-- 1 root root 543 Jun 26 08:33 README

Nanti kita akan menggunakan file fullchain.pem ini sebagai file sertifikat, dan privkey.pem sebagai kunci file sertifikatnya.

Generate Diffie-Hellman Group

Untuk meningkatkan lagi sekuriti, kita generate 2048-bit key dengan perintah
sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
Setelah selesai filenya akan ada di
/etc/ssl/certs/dhparam.pem.

Step 3: Konfigurasi TLS/SSL di Web Server (Nginx)

Sekarang kalian sudah punya sertifikat SSL, step berikutnya kita akan konfigurasi Nginx agar menggunakan sertifikat ini. Pada dasarnya setelah ini ada 3 step lagi yaitu :

  • Buat konfigurasi menggunakan snippet berisi SSL key dan sertifikatnya
  • Buat konfigurasi menggunakan snippet berisi settingan SSL agar bisa terus diapakai untuk kebutuhan di masa datang
  • Edit konfigurasi Nginx agar menggunakan 2 snippet kita ini tadi
Buat konfigurasi Snippet yang menunjuk ke SSL key dan sertifikatnya.

kita buat 1 file konfigurasi di folder snippet
sudo nano /etc/nginx/snippets/ssl-example.com.conf
rubah di bag akhir misal jadi ssl-ariadiprana.com.conf

isinya

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

Save.

Buat konfigurasi Snippet yang isinya settingan enkripsi

Jalankan perintah ini
sudo nano /etc/nginx/snippets/ssl-params.conf

Isinya

# from https://cipherli.st/
# and https://raymii.org/s/tutorials/Strong_SSL_Security_On_nginx.html

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
ssl_ecdh_curve secp384r1;
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 HSTS header for now
#add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;

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

Save.

Rubah konfigurasi Nginx untuk menggunakan SSL

sudo nano /etc/nginx/sites-available/default

Isinya

server {
    listen 80;
    server_name ariadiprana.com www.ariadiprana.com;
    root /var/www/ghost;
    return 301 https://$server_name$request_uri;

    location / {
        proxy_set_header   X-Real-IP $remote_addr;
        proxy_set_header   Host      $http_host;
        proxy_pass         http://127.0.0.1:2368;
        # return 301 https://ariadiprana.com$request_uri;
    }
    location ~ /.well-known {
        allow all;
    }
}
server {
    server_name ariadiprana.com;
    # SSL Part
    listen 443 ssl http2 default_server;
    listen [::]:443 ssl http2 default_server;
    include snippets/ssl-ariadiprana.com.conf;
    include snippets/ssl-params.conf;

    location / {
        proxy_pass http://localhost:2368;
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_buffering off;
    }
}

Save

Cek konfigurasinya apakah ada syntax error
sudo nginx -t

Restart Nginx
sudo service nginx restart

Sudah :D
Sekarang website anda kalau dibuka sudah ada gembok di kiri atasnya dan langsung redirect ke https.

Untuk mengeceknya bisa buka link berikut ini, diganti nama web dengan nama domain kalian.

https://www.ssllabs.com/ssltest/analyze.html?d=example.com

nanti keluarnya kira-kira seperti ini

Selamat dapat nilai A dan anda dinyatakan lulus! Kalau belum lulus, bersahabatlah dengan google ya. Pingin mengenal certbot dengan lebih dekat juga bisa dimulai dari dokumen ini

Bonus

Set up auto renewal untuk SSL nya bisa menjalankan perintah ini

sudo crontab -e

pilih no 2,
lalu ditambahkan saja sebaris ini

15 3 * * * /usr/bin/certbot renew --quiet --renew-hook "/bin/systemctl reload nginx"

nanti setiap jam 3.15 pagi Certbot akan renewal SSL biar nggak expired.