Konfigurasi SSL/TLS yang Benar untuk Portal Publik dan API SIMRS

Konfigurasi SSL/TLS yang Benar untuk Portal Publik dan API SIMRS

Sobat IT RS, siapa yang nggak pernah kena semprot gara-gara portal SIMRS muncul warning "Connection Not Secure"? Atau tiba-tiba ada kabar data pasien bisa disadap, padahal udah pasang HTTPS. Nah, SSL/TLS itu bukan cuma soal "nyala gembok hijau". Salah konfigurasi, tetap bocor, tetap rawan man-in-the-middle (MITM), dan alamat nilai audit keamanan jeblok. Bahkan di beberapa rumah sakit, skor SSL Labs jadi syarat internal audit IT, minimal A+ biar tidur tenang.

Di artikel ini, MinTIRS bakal kasih step by step konfigurasi SSL/TLS buat portal publik dan API SIMRS, biar skor A+ di SSL Labs dan bebas dari celah MITM pada transaksi data pasien. Semua pakai contoh konkret, entah Sobat pakai NGINX, Apache, atau reverse proxy container macem Traefik/Caddy.

Kenapa SSL/TLS Sering Salah di SIMRS?

Banyak RS asal pasang Let's Encrypt lalu puas. Tapi ternyata:

  • Pakai TLS versi lawas (TLS 1.0/1.1) — gampang dicolong traffic-nya.
  • Cipher suite sembarangan — support RC4, 3DES, bahkan export cipher.
  • HSTS nggak aktif — MITM masih bisa downgrade ke HTTP.
  • Certificate chain nggak lengkap — browser lama error, mobile gagal konek.
  • Ngandelin self-signed certificate — trusted CA wajib, terutama bila melayani pasien via portal publik.

Tujuan: A+ di SSL Labs, Lolos Audit, Data Aman

  • Aktifkan TLS minimal versi 1.2 (lebih baik tambah TLS 1.3 kalau bisa).
  • Matikan cipher lawas atau lemah.
  • Aktifkan HSTS, OCSP Stapling, forward secrecy.
  • Pastikan chain CA lengkap, tanpa intermediate yang bolong.
  • Redirect HTTP ke HTTPS otomatis. Jangan ada satu endpoint pun yang bisa diakses tanpa enkripsi.
  • Proteksi header — minimal aktifkan Secure, HttpOnly, X-Frame-Options, X-Content-Type-Options.

Langkah 1: Dapetin Sertifikat SSL yang Valid

Rekomendasi: Let's Encrypt (Gratis, Otomatis Renewal)

  • Pakai certbot di Linux, atau win-acme di Windows Server.
  • Pastikan domain RS sudah resolved publik; jangan pakai IP address.
  • Untuk API internal, tetap pakai subdomain valid (misal api.rs-anda.sch.id), jangan self-signed.
# Ubuntu/Debian
sudo apt update
sudo apt install certbot python3-certbot-nginx

# Proses obtain sertifikat (nginx)
sudo certbot --nginx -d portal.rs-anda.sch.id -d api.rs-anda.sch.id

# Renewal otomatis
sudo systemctl enable certbot.timer

Langkah 2: Konfigurasi TLS di NGINX (Portal & API)

Ini contoh sniplet nginx.conf yang sudah siap skor A+ SSL Labs (per 2024).


server {
    listen 443 ssl http2;
    server_name portal.rs-anda.sch.id api.rs-anda.sch.id;

    ssl_certificate /etc/letsencrypt/live/portal.rs-anda.sch.id/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/portal.rs-anda.sch.id/privkey.pem;

    # TLS ONLY 1.2/1.3
    ssl_protocols TLSv1.2 TLSv1.3;

    # Cipher Suites
    ssl_ciphers 'TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256';
    ssl_prefer_server_ciphers on;

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

    # OCSP Stapling
    ssl_stapling on;
    ssl_stapling_verify on;
    resolver 8.8.8.8 1.1.1.1 valid=300s;

    # Security Headers
    add_header X-Frame-Options DENY;
    add_header X-Content-Type-Options nosniff;
    add_header X-XSS-Protection "1; mode=block";
    add_header Referrer-Policy no-referrer;
    add_header Content-Security-Policy "default-src 'self'";

    # Redirect HTTP ke HTTPS (letakkan di server block port 80)
    # server {
    #   listen 80;
    #   server_name portal.rs-anda.sch.id api.rs-anda.sch.id;
    #   return 301 https://$host$request_uri;
    # }

    # SSL session cache
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;

    # Minimum DH param
    ssl_dhparam /etc/ssl/certs/dhparam.pem;

    # ... konfigurasi lokasi root, proxy_pass API, dsb
}

Generate dhparam (wajib demi forward secrecy):

openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

Kalau resource server terbatas, 2048 cukup. 4096 lebih aman tapi makan CPU.

Langkah 3: Cek Chain Certificate Lengkap

  • Jangan copy-paste hanya file cert utama saja di ssl_certificate, Wajib pakai fullchain.pem.
  • Khusus Let's Encrypt, fullchain.pem berisi cert + intermediate. Kalau pakai RapidSSL/Entrust, pastikan intermediate CA ikut.
  • Cek chain via openssl:
openssl s_client -connect portal.rs-anda.sch.id:443 -servername portal.rs-anda.sch.id -showcerts

Cari baris Verify return code: 0 (ok). Kalau bukan 0, chain ada yang bolong.

Langkah 4: Konfigurasi SSL/TLS di Apache HTTPD



    ServerName portal.rs-anda.sch.id

    SSLEngine on
    SSLCertificateFile /etc/letsencrypt/live/portal.rs-anda.sch.id/cert.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/portal.rs-anda.sch.id/privkey.pem
    SSLCertificateChainFile /etc/letsencrypt/live/portal.rs-anda.sch.id/chain.pem

    SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
    SSLCipherSuite TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256
    SSLHonorCipherOrder on

    Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"
    Header always set X-Frame-Options DENY
    Header always set X-Content-Type-Options nosniff
    Header always set X-XSS-Protection "1; mode=block"
    Header always set Referrer-Policy "no-referrer"
    Header always set Content-Security-Policy "default-src 'self'"

    SSLOptions +StrictRequire

    SSLSessionCache shmcb:/var/run/apache2/ssl_scache(512000)
    SSLSessionCacheTimeout  300

    # OCSP Stapling
    SSLUseStapling on
    SSLStaplingResponderTimeout 5
    SSLStaplingReturnResponderErrors off
    SSLStaplingCache shmcb:/var/run/apache2/ssl_stapling(32768)


Untuk redirect HTTP ke HTTPS di Apache:



    ServerName portal.rs-anda.sch.id
    Redirect permanent / https://portal.rs-anda.sch.id/

Langkah 5: Hardening Tambahan untuk API SIMRS (JSON, REST, gRPC)

  • Pastikan semua endpoint API wajib HTTPS, bahkan internal network.
  • Matikan TLS 1.0/1.1 di reverse proxy, walau client lama protes. Better safe, better audit score.
  • Aktifkan client certificate auth untuk endpoint sensitif (opsional, lebih aman).
  • Pastikan CORS header aman (jangan asal Access-Control-Allow-Origin: *).
  • JANGAN embed credential/token di URL query string — selalu pakai header Authorization dengan HTTPS.

Contoh CORS aman di NGINX:


location /api/ {
    add_header 'Access-Control-Allow-Origin' 'https://portal.rs-anda.sch.id' always;
    add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS' always;
    add_header 'Access-Control-Allow-Headers' 'Authorization,Content-Type' always;
    if ($request_method = 'OPTIONS') {
        return 204;
    }
    # ...proxy_pass ke backend
}

Langkah 6: Validasi dengan SSL Labs + Monitoring

  • Buka SSL Labs SSL Server Test. Masukkan domain portal/API RS.
  • Pastikan nilai A+. Kalau hanya A/BBB, cek bagian mana yang merah.
  • Typical error:
    • Masih enable TLS 1.1/RC4: cek ulang ssl_protocols/SSLProtocol dan ciphers.
    • Chain incomplete: salah file cert di config.
    • HSTS belum aktif: tambahkan header.
  • Monitoring: Aktifkan alert jika certificate hampir expired atau error chain.
  • Linux: bisa pakai cron + curl + mail untuk cek expiry otomatis:

# Simpan script berikut ke /usr/local/bin/check_ssl_expiry.sh

#!/bin/bash
DOMAIN="portal.rs-anda.sch.id"
THRESHOLD=15 # hari
EXPIRY=$(echo | openssl s_client -servername $DOMAIN -connect $DOMAIN:443 2>/dev/null | openssl x509 -noout -enddate | cut -d= -f2)
EXPIRY_SEC=$(date --date="$EXPIRY" +%s)
NOW_SEC=$(date +%s)
DAYS_LEFT=$(( ($EXPIRY_SEC - $NOW_SEC) / 86400 ))
if [ $DAYS_LEFT -lt $THRESHOLD ]; then
    echo "Sertifikat SSL domain $DOMAIN sisa $DAYS_LEFT hari!" | mail -s "Warning: SSL Expiry $DOMAIN" admin@rs-anda.sch.id
fi

Jadwalkan di cron agar auto-cek setiap hari:


0 7 * * * /usr/local/bin/check_ssl_expiry.sh

Contoh Kasus: Audit Keamanan SIMRS Gagal Karena TLS

Audit internal: "Mengapa SIMRS API dapat diakses via HTTP? Skor SSL Labs B, TLS 1.0 masih aktif." Tim IT: "Karena client lama, kadang harus support Windows XP." Pimpinan: "Data pasien bocor, tanggung jawab siapa?"
  • Solusi: Paksa semua API hanya aktif di TLS 1.2/1.3, redirect HTTP ke HTTPS, endpoint HTTP shutdown total.
  • Ganti client library yang jadul, push user upgrade.

Langkah 7: Setting Reverse Proxy Modern (Traefik/Caddy) — Otomatis SSL

Pakai container? Traefik/Caddy auto-renew Let's Encrypt plus TLS modern by default. Tapi tetap perlu cek config header dan protokol.


# Traefik v2 example (static config file traefik.yml)
entryPoints:
  web:
    address: ":80"
  websecure:
    address: ":443"
    http:
      tls:
        certResolver: letsencrypt
        # Force TLS 1.2/1.3
        options:
          minVersion: "VersionTLS12"
          cipherSuites:
            - TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
            - TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
            - TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
            - TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
        domains:
          - main: "portal.rs-anda.sch.id"
          - sans: "api.rs-anda.sch.id"

# Middleware header di Traefik (dynamic config)
http:
  middlewares:
    secureHeaders:
      headers:
        sslRedirect: true
        stsSeconds: 63072000
        stsIncludeSubdomains: true
        stsPreload: true
        frameDeny: true
        contentTypeNosniff: true
        browserXssFilter: true
        customResponseHeaders:
          Referrer-Policy: "no-referrer"
          Content-Security-Policy: "default-src 'self'"

Untuk Caddy, cukup tambahkan di Caddyfile:


portal.rs-anda.sch.id, api.rs-anda.sch.id {
    encode gzip
    tls {
        protocols tls1.2 tls1.3
    }
    header {
        Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"
        X-Frame-Options "DENY"
        X-Content-Type-Options "nosniff"
        X-XSS-Protection "1; mode=block"
        Referrer-Policy "no-referrer"
        Content-Security-Policy "default-src 'self'"
    }
    # ...proxy ke backend SIMRS
}

Langkah 8: Uji Client Lama (Minimalis Support, Jangan Korbankan Keamanan)

  • Beberapa SIMRS lama (VB6, Delphi, desktop) nggak support TLS 1.2/1.3. Kalau terpaksa, sediakan gateway proxy khusus, jangan buka sistem utama ke TLS lawas.
  • Audit berkala: cek log siapa yang masih akses pakai protocol lawas, push upgrade.
  • Kalau ada alat medis dengan firmware jadul hanya support TLS 1.0, pisahkan VLAN, limit akses API — jangan campur.

Checklist Otomatis: Skor A+ SSL Labs di SIMRS

  • HTTPS only, force redirect dari HTTP
  • TLS minimal 1.2, sebaiknya tambah 1.3
  • Cipher suite hanya yang secure, pecat RC4/3DES/NULL
  • Header security lengkap: HSTS, no-referrer, X-Frame-Options, dsb
  • OCSP Stapling aktif
  • Valid, trusted, lengkap certificate chain
  • Update sertifikat otomatis (Let's Encrypt renewal jalan)
  • Monitoring expiry + alert sebelum kadaluarsa
  • Audit log siapa yang akses pakai protokol lawas
  • Jangan pakai self-signed untuk publik, meski “lebih gampang”

Penutup: SSL/TLS Bukan Sekedar “Gembok Hijau”

SSL/TLS itu bukan formalitas. Salah set, data pasien bisa disadap, skor audit jeblok, bahkan bisa jadi urusan hukum. Sobat IT RS, jangan sampai kecolongan cuma gara-gara satu baris config. Ikuti langkah di atas, cek SSL Labs, dan rutin audit header serta sertifikat. Data pasien aman, skor audit A+, kepala dingin walau auditor datang mendadak. Sudah waktunya "gembok hijau" di browser bukan sekadar hiasan, tapi benar-benar jadi penjaga data SIMRS!