Konfigurasi Apache Reverse Proxy SSL Termination

Apache HTTP Server dapat dikonfigurasi sebagai reverse proxy untuk menangani dekripsi lalu lintas HTTPS (SSL Termination) di sisi server depan, lalu meneruskannya sebagai lalu lintas HTTP biasa (plaintext) ke server backend di jaringan internal. Konfigurasi ini memerlukan modul inti Apache seperti mod_proxy, mod_proxy_http, dan mod_ssl.

Persiapan Modul dan Prasyarat

Sebelum menyusun blok VirtualHost, pastikan modul-modul yang dibutuhkan telah diaktifkan pada sistem operasi berbasis Debian/Ubuntu menggunakan perintah a2enmod:

sudo a2enmod proxy
sudo a2enmod proxy_http
sudo a2enmod ssl
sudo a2enmod headers
sudo systemctl restart apache2

Tabel Parameter Direktif Utama SSL Termination

Direktif Apache Modul Terkait Fungsi Utama
SSLEngine mod_ssl Mengaktifkan atau menonaktifkan mesin enkripsi SSL/TLS pada VirtualHost.
SSLCertificateFile mod_ssl Menentukan jalur file sertifikat publik (.crt / .pem).
SSLCertificateKeyFile mod_ssl Menentukan jalur file kunci privat (private key) untuk dekripsi.
ProxyPass mod_proxy Memetakan URL jarak jauh ke server URL lokal atau backend.
ProxyPassReverse mod_proxy Menyesuaikan header HTTP 'Location' pada respons dari server backend.

Contoh Konfigurasi VirtualHost SSL Termination

Berikut adalah contoh blok konfigurasi lengkap untuk menangani port 443 di sisi publik dan meneruskannya ke aplikasi internal pada port 8080:

<VirtualHost *:443>
    ServerName example.com

    SSLEngine on
    SSLCertificateFile /etc/ssl/certs/example.crt
    SSLCertificateKeyFile /etc/ssl/private/example.key
    SSLCertificateChainFile /etc/ssl/certs/chain.crt

    # Protokol TLS yang diizinkan (nonaktifkan SSLv3, TLS 1.0, TLS 1.1)
    SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
    SSLCipherSuite HIGH:!aNULL:!MD5

    # Konfigurasi Reverse Proxy
    ProxyRequests Off
    ProxyPreserveHost On

    <Proxy *>
        Order deny,allow
        Allow from all
    </Proxy>

    ProxyPass / http://127.0.0.1:8080/
    ProxyPassReverse / http://127.0.0.1:8080/

    # Meneruskan informasi klien asli ke backend
    RequestHeader set X-Forwarded-Proto "https"
    RequestHeader set X-Forwarded-Port "443"

    ErrorLog ${APACHE_LOG_DIR}/proxy_error.log
    CustomLog ${APACHE_LOG_DIR}/proxy_access.log combined
</VirtualHost>

<VirtualHost *:80>
    ServerName example.com
    Redirect permanent / https://example.com/
</VirtualHost>

Langkah Penerapan dan Pengujian

  1. Simpan berkas konfigurasi di direktori /etc/apache2/sites-available/example.com.conf.
  2. Uji sintaks konfigurasi menggunakan perintah sudo apache2ctl configtest untuk memastikan tidak ada kesalahan pengetikan.
  3. Aktifkan situs dengan perintah sudo a2ensite example.com.conf.
  4. Muat ulang layanan Apache menggunakan sudo systemctl reload apache2.

Troubleshooting Umum

Jika aplikasi backend mendeteksi perulangan pengalihan (infinite redirect loop), pastikan aplikasi backend dikonfigurasi untuk mengenali header X-Forwarded-Proto: https yang dikirimkan oleh Apache. Tanpa header ini, aplikasi backend mungkin mengira permintaan awal datang melalui HTTP biasa lalu memerintahkan browser untuk beralih ke HTTPS secara terus-menerus.