Mengaktifkan HTTPS pada Nginx

Kali ini menepati janji kepada beberapa pengunjung (yang entah berapa lama) soal tutorial setting HTTPS pada Nginx. Baru bisa sekarang karena kebetulan sedang maintenance salah satu website klien, sekalian perpanjang sertifikat SSL. Juga fungsi panduan pemasangan SSL di Nginx ini adalah dokumentasi pribadi saya. Kalau ada kesalahan silahkan dikoreksi 🙂

Disini saya menggunakan Nginx 1.10.0 tapi seharusnya tidak ada perbedaan signifikan antar versi, malah dari perasaan sama saja semuanya. Dan yang pasti persiapkan sertifikat SSL yang ingin dipasangkan untuk nama domain/website anda. Anda bisa menggunakan Comodo, GeoTrust, Symantec, Rapid, DigiCert dan seterusnya untuk yang komersial. Sedangkan yang gratis ada WoSign dan StartSSL, dan Let’s Encrypt sistemnya beda lagi.

Disini saya menggunakan WoSign FreeSSL DV, bisa anda dapatkan disini: https://buy.wosign.com/free/ dan bagusnya didalam file ZIP yang diberikan sudah ada sertifikat SSLnya untuk Nginx. Dari CA lain kadang masih perlu diracik lagi sebelum benar – benar bisa digunakan.
WoSign Free SSL Certificate Zip file

Baru akhirnya kita masuk ke langkah – langkah instalasi sertifikat SSLnya pada VPS anda, pertama buat direktorinya:

mkdir /etc/nginx/ssl

Kemudian pindahkan file nama_domain.key, nama_domain.crt, nama_domain.pem, nama_domain_bundle.crt kedalamnya. Tidak harus ada semua, aslinya tergantung metode anda membuat CSR sewaktu diawal saat request sertifikat SSLnya. Intinya apapun file yang anda buat dan berhubungan dengan proses sebelumnya pindahkan saja ke direktori ini. Dan memang belum tentu dipakai semuanya.

Lanjutkan dengan mengedit konfigurasi virtual host websitenya (nama_domain.conf biasanya), dan kita akan mengalihkan trafik HTTP pada port 80 ke HTTPS:

server {
        listen 80;
        server_name nama_domain.com www.nama_domain.com;
        access_log /var/log/nginx/nama_domain.com-access.log;
        error_log /var/log/nginx/nama_domain.com-error.log;
        rewrite ^ https://$server_name$request_uri? permanent;
}

Dan buat blok kode baru untuk HTTPS agar mendengarkan di port 443:

server {
        listen 443 ssl;
        server_name nama_domain.com www.domain.com;
        access_log /var/log/nginx/domain.com-access.log;
        error_log /var/log/nginx/domain.com-error.log;
        root /var/www/nama_domain.com;
        index index.php index.html index.htm;
        ssl on;
        ssl_certificate /etc/nginx/ssl/1_nama_domain_bundle.crt;
        ssl_certificate_key /etc/nginx/ssl/nama_domain.key;
        ssl_session_cache shared:SSL:20m;
        ssl_session_timeout 10m;
        ssl_prefer_server_ciphers on;
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES25$
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
}

Setelah itu silahkan restart atau reload Nginx:

service nginx reload

Seharusnya situs anda sudah menggunakan HTTPS menggantikan HTTP untuk protokolnya. 🙂 Tapi saya ingatkan dulu, tutorial diatas adalah benar – benar hal dasar untuk instalasi SSL pada Nginx. Masih ada OSCP Stapling, HSTS, HPKP, HTTP/2 dan seterusnya. Memang saya batasi pembahasannya agar tidak menjadi terlalu rumit nantinya, yang penting jalan dulu HTTPSnya. Sisanya tambahan saja dan pasti akan saya bahas nanti. Kalau ada waktu dan saya ingat. Hehe. 😀

*Saya sarankan anda pakai WoSign juga sih biar sama dan tidak repot membuat bundle sertifikat SSLnya. Keunggulan lainnya adalah gratis. 😀

20 Comments

  1. Halo mas Chandra,

    Mau ngasi saran aja, baiknya blog ini di kasi halaman kontak atau penawaran jasa, supaya pengunjung seperti saya jika suatu saat butuh jasa mas Chandra bisa ngontak langsung, hanya sekedar saran, tapi penting….hehhe.

    Blog ini jadi referensi #1 saya belajar VPS untuk web berbahasa indonesia, nilai plusnya blog ini sering diupdate juga pertanyaan direspon dengan baik & cepat…

    Subhan

    1. Trims sarannya mas Subhan, dulu memang saya berikan email saya di setiap footer blog. Tapi akhirnya banyak yang minta support lewat email, untuk topik yang sudah saya bahas. Bukannya saya tidak mau membantu tapi supaya efisien dan tidak mengulang – ulang, saya arahkan ke link artikelnya dan kalau kurang jelas bisa ditanyakan disana juga. Jadi kalau ada diskusi atau pertanyaan nanti bisa bermanfaat bagi pengunjung lain juga yang mengalami masalah serupa. 🙂

      Soal jasa manage VPS, untuk sementara waktu belum menawarkan untuk umum mas. 😀 Sudah ada beberapa klien lama dan waktunya cukup tersita untuk itu. Daripada kualitas layanan turun karena kebanyakan klien (pernah mengalami karena terlalu rakus dulu, jadi pelajaran lah 🙂 ) jadi belum ada niat untuk kesitu saat ini.

      Blog ini tujuannya biar dokumentasi VPS saya tidak berserakan di notepad dan siapa tahu berguna buat yang lain. Dan saya sering update setiap pagi karena sekalian “manasin mesin” sebelum aktivitas dimulai. Hehe. 😛

      Apalagi kalau ada pertanyaan masuk. Saling membantu juga aslinya, kadang ada koreksi yang masuk karena salah paham saat belajar dulu terbawa sampai sekarang. 🙂

      Tapi email saya aslinya bisa dilihat disini mas: https://servernesia.com/dibalik-layar/

  2. Makasih coretan2 blognya sangat membantu mas Chandra.
    Saya baru coba membuat sertifikat di StartSSL.
    File 1_nama_domain_bundle.crt sudah saya dapatkan.
    Tapi file nama_domain.key itu dapatnya dari mana ya mas?
    Waktu di StartSSL saya pilih generate lewat IE.

    1. Halo mas Adi, kalau saya usul mas pakai WoSign saja gimana? Saya termasuk anti pakai StartSSL karena sistem loginnya ribet banget. Dan saya asli sudah lupa detail – detailnya kalau di StartSSL, jauh lebih baik WoSign yang user friendly.

  3. mas chandra,
    di bagian server block : ssl_certificate /ets/nginx/ssl/1_nama_domain_bundle.crt;
    yang saya dapatkan dari gogetssl file zip berisi dua file :
    nama filenya nama_domain_com.ca-bundle dan nama_domain.crt
    ekstensinya tidak crt seperti contoh diatas untuk bundle tapi ekstensinya .ca-bundle

    dan satu lagi file zip yang saya terima isinya :
    AddTrustExternalCARoot.crt COMODORSAAddTrustCA.crt COMODORSADomainValidationSecureServerCA.crt nama_domain.crt

    jadi berikut konfigurasi server block saya :

    server {
        listen       80;
        server_name  namadomain.com www.namadomain.com;
        return       301 https://namadomain.com$request_uri;
    }
    
    server {
        listen       443 ssl;
        server_name  namadomain.com;
        root   /usr/share/nginx/html;
    	
    	ssl on;
    	ssl_certificate /ets/nginx/ssl/nama_domain_com.crt;
    	ssl_certificate_key /etc/nginx/ssl/namadomain.key;
    	ssl_session_cache shared:SSL:20m;
    	ssl_session_timeout 10m;
    	ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    	ssl_prefer_server_ciphers on;
    	ssl_ciphers ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS;
    	add_header X-Content-Type-Options "nosniff";
    	add_header X-Frame-Options SAMEORIGIN;
    
        location / {
            index index.php index.html index.htm;
    	try_files $uri $uri/ /index.php?$uri&$args;
        }

    mohon koreksinya mas, trims 🙂

  4. mas chandra, baris ssl_certificate /ets/nginx/ssl/1_nama_domain_bundle.crt; contoh di atas sepertinya typo, seharusnya ETC bukan ETS 🙂
    ketahuan pas reload, hasilnya file not found 😀

  5. saya coba cek via https://redbot.org/
    hasilnya : https://goo.gl/frZRp3
    di bagian X-Frame-Options SAMEORIGIN; hasilnya dobel.
    sebelum pasang https opsi tsb sudah ada dan aktif dan saat edit server block untuk aktivasi https saya tambahkan lagi sesuai tutorial mas chandra di artikel security header, sepertinya itu penyebab dobelnya 😀

    1. Oh sudah ada secara default berarti. Ambil seperlunya saja mbak.

      Efeknya terasa tidak? Soalnya kalau ga di inframe ya ga kerasa. Atau diinjeksi iklan.

      1. sebelumnya saya tambahkan tiga opsi sesuai artikel security header, tampilan forum malah amburadul, jadi sekarang cuma pakai satu opsi saja yaitu : add_header X-Content-Type-Options "nosniff";

        semua iklan sudah nggak mengganggu lagi mas, sip dah 🙂

      2. Paling tepat memang ambil seperlunya mbak. Kan ga semua kasusnya persis sama dan solusinya juga. 🙂

        Boleh tahu kena iklan dari operator apa saja mbak? Mungkin saya buatkan listnya biar bantu webmaster lain mengatasinya. Yang saya pakai kurang nakal berarti.:D Ga ada aneh – anehnya.

  6. ternyata file zip yang berisi 4 file crt sebelumnya harus di bundel jadi satu file crt.
    kalau belum, nanti saat proses cek ssl di https://www.sslshopper.com/ssl-checker.html akan muncul warning untrusted dll.

    cara bundel jadi satu, eksekusi perintah berikut dan harus urut tidak boleh tertukar karna sebelumnya saya asal masukin urutan pas reload nginx muncul error :D, berikut perintahnya :

    cat nama_domain_com.crt COMODORSADomainValidationSecureServerCA.crt COMODORSAAddTrustCA.crt AddTrustExternalCARoot.crt > ssl-bundle.crt

    semoga membantu yang lain bila nemu masalah seperti saya 🙂

    1. Nah ini. Saya tahu ada tahap ini tapi bingung jelasinnya mbak. Soalnya bundel tiap – tiap penerbit bisa beda isinya. Mau digabung mana dan urutannya gimana kadang per kasus. Untunglah mbak paham. 😀

  7. pagi mas chandra,
    pagi ini saya coba restart nginx dan muncul pesan error berikut ini:

    nginx: [warn] the "ssl" directive is deprecated, use the "listen ... ssl" directive instead in..

    bingung apa maksudnya 🙁
    trims.

      1. Trims followupnya mbak. Saya juga jadi tahu ada perubahan di versi itu, Nginx di server saya masih 1.13 😀

  8. Siang Mas,
    Semoga masih di respons nih, karena pertanyaan terakhir bulan Juni 2018, hehe.
    Saya sudah punya 2 file .crt, nah tapi saya tidak punya akses ftp & putty sebagai root, jadi saya tidak bisa copy file atau pun nano file di folder /etc/nginx/ssl.

    Pertanyaannya apakah harus di folder /etc/nginx/ssl lokasi file .crt nya untuk di aktifkan di virtual host?

Tinggalkan Balasan ke Chandra Batalkan balasan

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *