Sertifikat SSL gratis dari Cloudflare

Setelah setahun, sertifikat SSL gratisan yang saya dapat dari StartSSL akhirnya kadaluarsa. Kalau mau lanjut, tentu saja saya harus pengajukan pembaruan dan memperbarui sertifikat yang sekarang dipakai. Proses ngurus sesuatu di StartSSL itu aga2.. er… ribet :/ jadi males xD

Namun.. berhubung sekarang Cloudflare menyediakan sertifikat SSL gratisan, saya memutuskan tuk pindah saja haha 😀 Kebetulan domain ini emang sudah ditangani oleh Cloudflare jadi mestinya saya cukup mengatur agar segala lalul intas melewati server Cloudflare dulu. Gak masalah lah ini 😀

cloudflare

Tapi sebelum itu, saya jg harus mengaktifkan dukungan SSL di Cloudflare. Dari empat opsi penggunaan SSL yang ada, saya memilih Full SSL supaya koneksi dari Cloudflare ke server tempat saya naro blog ini juga tetap menggunakan HTTPS. Pakai sertifikat yang mana? tentu saja pakai yg sudah kadaluarsa itu hihi 😀

ssl

Memakai sertifikat SSL gratisan dari Cloudflare ini bukan ngga ada resikonya. Salah satunya adalah browser pengunjung udah mesti punya SNI (Server Name Indication, bukan Standar Negara Indonesia :P). Walau udah banyak browser yang mendukung SNI, tapi si Cloudflare bilang cuma sekitar 52% pengunjung dari Indonesia yang memakai browser ber-SNI (eh?).

Selain itu, Cloudflare memasukkan lebih dari satu domain agar terdaftar dalam sertifikat yang sama. Jadi semacam bbrp orang berbagi KTP yang sama walau di KTP tersebut tertulis setiap nama orang yang ikutan berbagi.

ssl

Keuntungannya? Dapet wildcard certificate! Sub domain jadi bisa dipasangi HTTPS juga tanpa sertifikat tambahan!

Reverse Proxy from HTTP to HTTPS with Apache

The other day, I had problem accessing an HTTPS site from a Python script. Since I had no time to spend figuring out why (it was for a personal project anyway), I decided to make a reverse proxy using Apache. However, unlike the commonly setup reverse proxy, this one is to make an HTTPS site available as HTTP site.

This is what I needed to put in my Apache config.

<VirtualHost 127.0.0.1:12345>
    ...
    SSLProxyEngine On
    ProxyPass / https://that.secure.site/
    ProxyPassReverse / https://that.secure.site/
    ....
</VirtualHost>

I also had to enable mod_proxy and mod_ssl which can be done easily (on Debian based system) by running the following command

# a2enmod proxy ssl

Then reload or restart Apache

# service apache2 reload

The most important bit in the config above is SSLProxyEngine On. Without this the proxy would not work!

Reverse Proxy dari HTTP ke HTTPS

Masalah lain yang saya temui setelah nyadar kalo tempat saya naro file RSS blog gak bisa diakses adalah ternyata si jadul PlanetPlanet kombinasi dg Python 2.7 punya masalah saat nyedot data dari situs https ini. Entah apakah ini kasus spesifik atau ngga, saya kurang tau 😛

Saat saya menjalankan si PlanetPlanet, tiba2 dia ngeluarin exception di bawah ini.

Traceback (most recent call last):
  File "/anu/itu/planet/feedparser.py", line 1893, in _open_resource
    return opener.open(request)
  File "/usr/lib/python2.7/urllib2.py", line 400, in open
    response = self._open(req, data)
  File "/usr/lib/python2.7/urllib2.py", line 418, in _open
    '_open', req)
  File "/usr/lib/python2.7/urllib2.py", line 378, in _call_chain
    result = func(*args)
  File "/usr/lib/python2.7/urllib2.py", line 1215, in https_open
    return self.do_open(httplib.HTTPSConnection, req)
  File "/usr/lib/python2.7/urllib2.py", line 1174, in do_open
    h.request(req.get_method(), req.get_selector(), req.data, headers)
  File "/usr/lib/python2.7/httplib.py", line 958, in request
    self._send_request(method, url, body, headers)
  File "/usr/lib/python2.7/httplib.py", line 992, in _send_request
    self.endheaders(body)
  File "/usr/lib/python2.7/httplib.py", line 954, in endheaders
    self._send_output(message_body)
  File "/usr/lib/python2.7/httplib.py", line 814, in _send_output
    self.send(msg)
  File "/usr/lib/python2.7/httplib.py", line 776, in send
    self.connect()
  File "/usr/lib/python2.7/httplib.py", line 1161, in connect
    self.sock = ssl.wrap_socket(sock, self.key_file, self.cert_file)
  File "/usr/lib/python2.7/ssl.py", line 381, in wrap_socket
    ciphers=ciphers)
  File "/usr/lib/python2.7/ssl.py", line 141, in __init__
    ciphers)
TypeError: must be _socket.socket, not _socketobject

Nanya2 oom google ngga membawa hasil yang menggembirakan. Berhubung saya lagi males ngecek2 lebih jauh, jadi saya putuskan tuk bikin situs blog ini tersedia dalam modus http juga walau cuma bisa diakses dari localhost 😛 ehh ternyata sepertinya si wordpress kekeuh sekali https, tetap https (duh). Berhubung yg ini gagal, saya coba cara lain dg bikin reverse proxy aja 😀 proxy yang membungkus situs https tuk disediakan dalam http.

Kira2 begini konfigurasinya

<VirtualHost 127.0.0.1:12345>
    ...

    SSLProxyEngine On
    ProxyPass / https://fajran.web.id/
    ProxyPassReverse / https://fajran.web.id/

    ...
</VirtualHost>

Nyalakan modul mod_proxy dan mod_ssl dan restart/reload si apache.

Konfigurasi di atas mirip dg cara membuat reverse proxy biasa, namun ada bagian penting yang ngga boleh kelupaan ditulis: SSLProxyEngine On. Tanpa ini, proxy dari http ke https ngga bisa jalan.