Nginx Node Js Dan Https Dengan Lets Encrypt

--- layout: post title: Nginx, Node.JS dan HTTPS dengan Let's Encrypt date: 2016-06-22 11:06:54.000000000 +07:00 type: post published: true status: publish categories: - GNU/Linux - Networking - Security - Server tags: - Lets Encrypt - Nginx - node.JS - SSL - web

Jadi sebenernya saya sudah cukup sering untuk membuat sertifikat SSL dengan menggunakan Let's Encrypt, lalu mengkonfigurasikan sertifikat SSL dengan menggunakan Nginx yang berfungsi sebagai Reverse Proxy dari aplikasi yang berbasis Node.JS. Jadi tulisan ini sekaligus sebagai pengingat saya biar gampang nyarinya. Saya ini suka gampang lupa soalnya. :D

Memasang Let's Encrypt

Pada tulisan ini saya menggunakan Debian Jessie sebagai host saya. Aktifkan repositori jessie-backports karena sudah tersedia aplikasi klien untuk Let's Encrypt. Untuk mengaktifkannya bisa dilihat pada halaman ini.

sudo apt-get install certbot -t jessie-backports

Membuat sertifikat SSL

Jalankan perintah berikut untuk mendapatkan sertifikat SSL. Pastikan untuk menyesuaikan domain website sesuai dengan yang digunakan. Sebagai catatan, kasus saya saat ini membuat sebuah sertifikat untuk 2 alamat website, karena mempunyai konfigurasi yang sama.

certbot certonly --standalone -d www.example.com -d example.com

Jika sukses, sertifikat akan berada pada direktori /etc/letsencrypt/live/example.com.

Konfigurasi Nginx

Konfigurasi berkas untuk domain yang telah di buat tadi. Saya membuat berkas baru, yaitu /etc/nginx/sites-available/example.com.

server {

    listen 80;
    server_name example.com www.example.com;

    # redirect all urls to https
    return 301 https://$server_name$request_uri;
}

server {
 
    listen 443 ssl;

    server_name example.com www.example.com;
    # add Strict-Transport-Security to prevent man in the middle attacks
    add_header Strict-Transport-Security "max-age=31536000";

    # ssl certificate config
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;

    error_log  /var/log/nginx/example-com.error.log;
    access_log /var/log/nginx/example-com.access.log;

    location / {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_set_header X-NginX-Proxy true;

        proxy_pass http://127.0.0.1:your-port;
        proxy_redirect off;

        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}

Beberapa catatan tentang konfigurasi di atas:

  • Konfigurasi di atas berfungsi sebagai reverse proxy.
  • Sesuaikan nama domain dan juga letak berkas sertifikat.
  • Pastikan mengganti your-port dengan port yang sesuai.
  • Otomatis melempar request http ke https.

Buat symbolic link dari berkas yang dibuat di atas, agar aktif.

sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/example.com

Pastikan memuat ulang konfigurasi Nginx.

sudo systemctl restart nginx.service

Ujicoba Konfigurasi Nginx + SSL

SSL Labs menyediakan audit untuk SSL secara gratis dan lengkap.

Selanjutnya ngoprek biar webnya lebih aman dan maknyus.

Salam,
Moko yang lagi galau.

Referensi

[0] https://letsencrypt.org/
[1] https://www.digitalocean.com/community/tutorials/how-to-secure-nginx-with-let-s-encrypt-on-ubuntu-16-04
[2] https://www.smalldata.tech/blog/nginx-nodejs-and-https-via-letsencrypt