Gitlab Pages, Custom Domain, Let's Encrypt dan acme.sh

Tiga bulan berlalu setelah blog ini menggunakan Let’s Encrypt untuk mendapatkan sertifikat SSL. Triwulan ini banyak hal yang terjadi dalam kehidupan saya pribadi, yang mengaramkan hasrat untuk menulis. Blog ini seakan terbengkalai, hanya dua artikel dalam tiga bulan.

Dan kemarin, seorang teman di Telegram menunjukkan tangkapan layar dia mendapati maklumat ketika berupaya membuka https://www.rizaumami.com; Your connection is not private.
Aah, rupanya sertifikat SSL dari Let’s Encrypt telah mencapai masa kadaluwarsa dan blog tidak lagi bisa diakses menggunakan https.
Seperti diketahui, sertifikat yang waktu lalu diperoleh dengan cara manual hanya berlaku untuk 3 bulan dan mesti diperbaharui secara manual pula.

Not a big deal.
That’s what I thought.
But, oh, boy. How I was wrong.

Segera menuju repo Let’s Encrypt lokal hasil penggandaan dari https://github.com/letsencrypt/letsencrypt untuk memperbaharui atau meminta ulang sertifikat SSL. Eh, ternyata prosesnya tidak semulus kulit wajah artis Korea. Perintah certbot-auto seketika terhenti karena galat dari pip.

Berbagai upaya ditempuh agar pip bisa berjalan, baik dengan memasang python-pip yang berdasar python2 atau memasang python3-pip yang berdasar python3 namun tidak kunjung membuahkan hasil. Dunno which one is borked, my system or python, but I’m tired of this shit. Lelah, akhirnya sempat terpikir untuk boot ke live Linux dan menjalankan certbot-auto di sana.

Jadi jalma mah kudu bodo alĂ©woh, ulah bodo katotoloyoh…
Jika tidak tahu harus banyak bertanya, jangan hanya diam.

Maka bertanyalah saya di grup Telegram PegeLinux, dan beruntung ada yang sudi memberikan pencerahan; acme.sh. Singkatnya, acme.sh adalah penerapan klien protokol ACME menggunakan skrip shell. Sounds good, and actually it’s quite good too….

Ada dua hal yang tidak seperti yang semula saya sangkakan:

  • tidak bisa menerbitkan sertifikat untuk banyak domain sekaligus, dan
  • fitur -deploy ke hook gitlab nampaknya hanya bagi mereka yang memasang gitlab mandiri.

Selain dua itu, lumayanlah. Dan mungkin saja dua hal di atas bukan merupakan kekurang acme.sh, melain hanya karena ketidaktahuan saya.

Let’s cut the noise…

Memasang acme.sh

Beragam cara memasang acme.sh bisa dibaca di laman https://github.com/Neilpang/acme.sh/wiki/How-to-install. Namun cara berikut lebih disarankan:

git clone https://github.com/Neilpang/acme.sh.git
cd acme.sh
./acme.sh --install

Menerbitkan sertifikat SSL baru menggunakan acme.sh

Rujuk laman https://github.com/Neilpang/acme.sh/wiki/How-to-issue-a-cert untuk menemukan cara mendapatkan sertifikat menggunakan acme.sh yang sesuai dengan kebutuhan.
Karena blog ini menumpang di GitLab Pages, maka standalone mode dirasa paling cocok.

Entah apa yang kurang, namun perintah acme.sh --issue -d rizaumami.com --standalone semata ternyata gagal menerbitkan sertifikat; ia tidak menemukan berkas acme-challenge di blog.
Tentu saja berkas ini tidak ada karena saya tidak membuatnya. Dan saya tidak membuatnya karena tidak ada jeda untuk membuatnya terlebih dahulu. Berbeda dengan lentsencrypt-auto yang memberi kita jeda untuk menyimpan berkas acme-challenge terlebih dahulu baru ia memeriksa keberadaan berkas tersebut di blog, acme.sh ini terus melaju hingga akhirnya terhenti karena tidak menemukan berhas challenge.

Banyak jalan menuju Roma.

Tidak mengerti menggunakan challenge di acme.sh, kita bisa menggunakan DNS manual mode.

  • Jalankan perintah

    acme.sh --issue -d rizaumami.com --dns --yes-I-know-dns-manual-mode-enough-go-ahead-please
    

    Hasilnya akan serupa berikut (sebagian teks disamarkan):

    [Wed 23 Jan 2019 03:09:28 PM WIB] Single domain='DNS:rizaumami.com'
    [Wed 23 Jan 2019 03:09:28 PM WIB] Getting webroot for domain='rizaumami.com'
    [Wed 23 Jan 2019 03:09:28 PM WIB] Getting new-authz for domain='rizaumami.com'
    [Wed 23 Jan 2019 03:09:31 PM WIB] The new-authz request is ok.
    [Wed 23 Jan 2019 03:09:32 PM WIB] Add the following TXT record:
    [Wed 23 Jan 2019 03:09:32 PM WIB] Domain: '_acme-challenge.rizaumami.com'
    [Wed 23 Jan 2019 03:09:32 PM WIB] TXT value: 'f1o7kb9CWqcdduXCTolGx4AmcHZywR_zWARe5wh_1mo'
    [Wed 23 Jan 2019 03:09:32 PM WIB] Please be aware that you prepend _acme-challenge. before your domain
    [Wed 23 Jan 2019 03:09:32 PM WIB] so the resulting subdomain will be: _acme-challenge.rizaumami.com
    [Wed 23 Jan 2019 03:09:32 PM WIB] Please add the TXT records to the domains, and re-run with --renew.
    [Wed 23 Jan 2019 03:09:32 PM WIB] Please add '--debug' or '--log' to check more details.
    [Wed 23 Jan 2019 03:09:32 PM WIB] See: https://github.com/Neilpang/acme.sh/wiki/How-to-debug-acme.sh
    [Wed 23 Jan 2019 03:09:32 PM WIB] Removing DNS records.
    [Wed 23 Jan 2019 03:09:32 PM WIB] Not Found domain api file:
    
  • Masuk ke laman dashboard layanan tempat kita membeli domain dan masuk ke bagian pengaturan DNS.
    Tambahkan domain _acme-challenge.rizaumami.com dan nilai f1o7kb9CWqcdduXCTolGx4AmcHZywR_zWARe5wh_1mo ke bagian TXT record.

  • Penambahan TXT di atas mungkin memerlukan waktu untuk merambat (DNS propagation), jadi jika langkah berikut tidak segera menampakkan hasil, ambil jeda kemudian coba kembali.

    acme.sh --renew -d rizaumami.com --dns --yes-I-know-dns-manual-mode-enough-go-ahead-please
    

    Jika tiada aral, kita akan mendapatkan sertifikas SSL baru.

    [Wed 23 Jan 2019 03:09:58 PM WIB] Renew: 'rizaumami.com'
    [Wed 23 Jan 2019 03:09:58 PM WIB] Single domain='DNS:rizaumami.com'
    [Wed 23 Jan 2019 03:09:58 PM WIB] Verifying: rizaumami.com
    [Wed 23 Jan 2019 03:10:02 PM WIB] Success
    [Wed 23 Jan 2019 03:10:06 PM WIB] Verify finished, start to sign.
    [Wed 23 Jan 2019 03:10:09 PM WIB] Cert success.
    -----BEGIN CERTIFICATE-----
    
    --- Aslinya banyak karakter acak di sini. DIHAPUS. ---
    
    -----END CERTIFICATE-----
    [Wed 23 Jan 2019 03:10:09 PM WIB] Your cert is in  /home/iza/.acme.sh/rizaumami.com/rizaumami.com.cer
    [Wed 23 Jan 2019 03:10:09 PM WIB] Your cert key is in  /home/iza/.acme.sh/rizaumami.com/rizaumami.com.key
    [Wed 23 Jan 2019 03:10:09 PM WIB] The intermediate CA cert is in  /home/iza/.acme.sh/rizaumami.com/ca.cer
    [Wed 23 Jan 2019 03:10:09 PM WIB] And the full chain certs is there:  /home/iza/.acme.sh/rizaumami.com/fullchain.cer
    [Wed 23 Jan 2019 03:10:09 PM WIB] It seems that you are using dns manual mode. please take care: The dns manual mode can not renew automatically, you must issue it again manually. You'd better use the other modes instead.
    [Wed 23 Jan 2019 03:10:09 PM WIB] Call hook error.
    

Menyimpan sertifikat ke GitLab Pages

Blog yang dibuat di GitLab Pages akan diberi domain <gitlab_username>.gitlab.io. Laman gitlab.io (misal rizaumami.gitlab.io) asalinya sudah bisa diakses melalui https (misal https://rizaumami.gitlab.io), namun jika hendak menggunakan custom domain kita akan kehilangan fitur https ini. Untungnya, GitLab Pages menyediakan fitur custom domain bersertifikat SSL yang memungkinkan kita menggunakan sertifikat gratisan dari Let’s Encrypt dan menjadikan custom domain kita bisa diakses melalui https.

Silakan baca kembali artikel Menggunakan Custom Domain dan Sertifikat SSL/TLS di GitLab Pages untuk mengetahui cara menambahkan custom domain dan sertifikat SSl/TLS ke blog GitLab Pages.

Sesuai hasil contoh di atas:

  • isi nama custom domain, misal rizaumami.com di kolom Domain.
  • salin isi sertifikat /home/iza/.acme.sh/rizaumami.com/fullchain.cer ke kolom Certificate (PEM).
  • salin isi sertifikat /home/iza/.acme.sh/rizaumami.com/rizaumami.com.key ke kolom Key (PEM).

That’s it. Seperti yang telah dikemukakan di atas, saya tidak bisa meminta sertifikat untuk dua domain sekaligus, jadinya langkah-langkah di atas dilakukan sebanyak domain yang diinginkan. Setidaknya saya melakukannya dua kali, pertama meminta sertifikat untuk rizaumami.com dan kedua untuk subdomain www.rizaumami.com. Dan mungkin nanti saya akan kembali menulis artikel senada dengan artikel ini ketika sertifikat kadaluwarsa 3 bulan mendatang. Let’s hope there will be an easier way then…