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
certbotdi Linux, atauwin-acmedi 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 pakaifullchain.pem. - Khusus Let's Encrypt,
fullchain.pemberisi 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 + mailuntuk 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!
PETIRS