Categories
Dokumentasi

Mengaktifkan SSL (HTTPS) Pada Web Berbasis Apache dan Open SSL

Daftar Isi

Antisipasi Akses SSL Menggunakan IP Publik Maupun Lokal

|-Alternatif 1: Redirect IP ke Domain

(sumber: https://www.digitalocean.com/community/questions/redirect-ip-to-domain-name, terakhir diakses 16 Jan 2020)

  1. Buat berkas konfigurasi untuk redirect (sesuai kebutuhan)
    userpc@pc:~/# nano /var/www/virtualhostrule.conf
    1. Contoh 1
      #Berkas ini dipanggil oleh Apache2 di dalam Virtual Host (mirip .htaccess)
      #Jangan dihapus
      RewriteEngine On
      #IP Publik
      RewriteCond %{HTTP_HOST} ^123\.456\.789\.1$ [OR]
      #Atau IP Lokal
      RewriteCond %{HTTP_HOST} ^192\.168\.1\.1$ [OR]
      #Atau Domain Lokal
      RewriteCond %{HTTP_HOST} ^domain\.lokal$ [OR]
      #Atau HTTP (meskipun portnya sudah HTTPS)
      RewriteCond %{HTTPS} off
      #di redirect
      RewriteRule ^(.*)$ https://www.domain.com [L,R=301]
    2. Contoh 2
      #Berkas ini dipanggil oleh Apache2 di dalam Virtual Host (mirip .htaccess)
      #Jangan dihapus
      RewriteEngine On
      #folder tertentu dari lokal
      RewriteCond %{HTTP_HOST} ^domain\.lokal$
      RewriteCond %{REQUEST_URI} foldertertentu
      RewriteRule ^(.*)$ https://local-www.domain.com/foldertertentu [L,R=301]
      RewriteCond %{HTTP_HOST} ^192\.168\.1\.1$
      RewriteCond %{REQUEST_URI} foldertertentu
      RewriteRule ^(.*)$ https://local-www.domain.com/foldertertentu [L,R=301]
      #IP Lokal
      RewriteCond %{HTTP_HOST} ^192\.168\.1\.1$ [OR]
      RewriteCond %{HTTP_HOST} ^domain\.lokal$
      RewriteRule ^(.*)$ https://local-www.domain.com [L,R=301]
      #IP Publik
      RewriteCond %{HTTP_HOST} ^123\.456\.789\.1$
      RewriteCond %{HTTPS} off
      RewriteRule ^(.*)$ https://www.domain.com [L,R=301]
  2. Tambahkan Include di /etc/apache2/sites-enabled/000-default.conf di dalam <VirtualHost *:80> serta di /etc/apache2/sites-enabled/default-ssl.conf di dalam <VirtualHost _default:443>, seperti contoh di bawah ini:
    include rule
  3. Restart Apache
  4. Coba akses menggunakan HTTP dengan port HTTPS, misal http://www.domain.com. Apabila muncul pesan kesalahan dengan kode 400 (Bad Request), maka tambahkan di /etc/apache2/sites-enabled/000-default.conf baris berikut:
    #untuk error kode 400 (Bad Request)
    ErrorDocument 400 "<meta http-equiv = 'refresh' content = '0; url = https://%{HTTP_HOST}' />"

|-Alternatif 2: Jika IP Lokal Tidak Memungkinkan Di Redirect (menggunakan SNI)

(sumber: https://www.digicert.com/ssl-support/apache-multiple-ssl-certificates-using-sni.htm, terakhir diakses 16 Jan 2020)

  1. Lakukan: SSL Buat Sendiri, misalnya IP Lokal 192.168.1.1, maka alamat itu dimasukkan ke dalam v3.ext sehingga akan seperti ini:
    authorityKeyIdentifier=keyid,issuer
    basicConstraints=CA:FALSE
    keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
    subjectAltName = @alt_names
    [alt_names]
    IP.1 = 192.168.1.1
    #localhost
    IP.2 = 127.0.0.1
  2. Buat folder baru di /etc/ssl, misalnya folder SSLip
    userpc@pc:~/# mkdir /etc/ssl/SSLip
    salin domain.crt, private.key dan intermediate.ca-bundle ke folder SSLip tersebut
  3. Tambahkan Virtual Host di /etc/apache2/sites-enabled/default-ssl.conf, di atas Virtual Host yang sudah ada
    <VirtualHost 192.168.1.1:443>
    ServerName www.domain1.com
    #DocumentRoot disamakan dengan yang awal
    DocumentRoot /var/www/html/
    SSLEngine on
    SSLCertificateFile /etc/ssl/SSLip/domain.crt
    SSLCertificateKeyFile /etc/ssl/SSLip/private.key
    SSLCACertificateFile /etc/ssl/SSLip/intermediate.ca-bundle
    </VirtualHost>
    #Virtual Host Awal
    <VirtualHost _default_:443>
    ServerName www.domain2.com
    ...

Jika server tidak mendukung SNI, maka bisa menggunakan 2 port yang berbeda untuk lokal dan publik, misalnya: port 443 dan 8443, sehingga akan seperti ini:
Listen 443
Listen 8443
<VirtualHost 192.168.1.1:443>
...
</VirtualHost>
<VirtualHost 192.168.1.1:8443>
...
</VirtualHost>

Adaptasi

|-Moodle

  1. Pada config.php, edit $CFG->wwwroot menjadi seperti ini:
    //adaptasi dengan http atau https, agar tidak ada mixed http dengan https
    $http = 'http' . ((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') ? 's' : '') . '://';
    //alamat jika
    tidak dikenal
    $defaultaddress = $http.'172.16.100.101';
    //alamat saat ini
    $currentaddress = $http.$_SERVER["SERVER_NAME"];
    //alias dari alamat moodle
    $allowedaddresses = array($http.'172.16.100.101', $http.'49.128.176.214', $http.'local.elearning.unisayogya.ac.id', $http.'elearning.unisayogya.ac.id');
    //contoh jika ada yang pasti http
    //$allowedaddresses = array($http.'172.16.100.101', 'http://49.128.176.214', $http.'local.elearning.unisayogya.ac.id', $http.'elearning.unisayogya.ac.id');
    //set $CFG->wwwroot
    if (in_array($currentaddress, $allowedaddresses)) $CFG->wwwroot = $currentaddress; else $CFG->wwwroot = $defaultaddress;
  2. Pada default_ssl.conf atau httpd-ssl.conf:
    Header always set X-Frame-Options DENY diganti dengan Header always set X-Frame-Options SAMEORIGIN

|-Code Igniter

Pada config.php, edit $config[‘base-url’] menjadi seperti ini:

$http = 'http' . ((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') ? 's' : '') . '://';
$newurl = str_replace("index.php","", $_SERVER['SCRIPT_NAME']);
$config['base_url'] = "$http" . $_SERVER['SERVER_NAME'] . "" . $newurl;

By basit

Biro Pengembangan Teknologi Dan Sistem Informasi

5 replies on “Mengaktifkan SSL (HTTPS) Pada Web Berbasis Apache dan Open SSL”

Wah artikel nya sangat menarik, banyak informasi bermanfaat yang saya ambil dari artikel ini. Saya baru tau kalau apache bisa diberikan SSL. Terimakasih min atas artikel nya

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.