D
P
0
← Semua artikel Read in English

JavaScript, DOM & Animasi Browser

Semua Host Vimeo Menolak TLS dengan `certificate has expired`: Sertifikatnya Milik `internetpositif.id`

· · 7 menit baca
Semua Host Vimeo Menolak TLS dengan `certificate has expired`: Sertifikatnya Milik `internetpositif.id`

Lompat ke bab di pemutar Vimeo sudah masuk daftar yang belum terverifikasi sejak catatan 21 September, dengan sebabnya ditulis langsung di sebelahnya: player.vimeo.com menjawab dengan sertifikat yang salah dari jaringan ini, karena Vimeo diblokir di sini. Daftar kerja yang ditulis ulang 21 September sore merencanakan mencoba lompat bab itu di staging dari jaringan yang bisa menjangkau Vimeo. Dua hari kemudian, catatan keadaan 23 September pagi masih menulis bahwa lompat bab belum pernah terlihat berjalan.

Bunyi galatnya terekam di catatan 12 Oktober: semua domain Vimeo menolak koneksi dari mesin saya dengan certificate has expired. Sehari kemudian, 13 Oktober, saat mengecek parameter waktu mulai untuk halaman item anggota, setiap host Vimeo kembali menolak sambungan TLS dari laptop kerja saya. Pada pengecekan itu, sertifikat yang disajikan host-host tersebut saya baca subjeknya.

Kelima host menyajikan sertifikat internetpositif.id

Host yang tercatat ada lima: player.vimeo.com, api.vimeo.com, vimeo.com, help.vimeo.com, dan developer.vimeo.com. Di jaringan saya, kelimanya menyajikan sertifikat untuk internetpositif.id, filter Internet Positif milik pemerintah Indonesia. Subjek sertifikat itu dibaca dengan openssl s_client yang keluarannya dialirkan ke openssl x509 -noout -subject. Catatan saya menyimpan perintahnya dalam bentuk singkat, jadi blok di bawah juga memuat bentuk umumnya untuk siapa pun yang ingin mengulang pemeriksaan ini di jaringannya sendiri:

# yang tercatat:  openssl s_client ... | openssl x509 -noout -subject
# bentuk umum untuk mengulangnya, satu host per perintah:
openssl s_client -connect player.vimeo.com:443 -servername player.vimeo.com </dev/null 2>/dev/null \
  | openssl x509 -noout -subject

Permintaan HTTP biasa ke host Vimeo gagal dengan cara yang sama, dengan pesan certificate has expired. Pesan itu hanya melaporkan pemeriksaan mana yang gagal, tanpa menyebut sertifikat siapa yang sedang diperiksa. Bunyinya menggiring perhatian ke soal tanggal, misalnya jam laptop yang melenceng atau sertifikat Vimeo yang terlambat diperpanjang, padahal sertifikat yang ditolak memang bukan untuk Vimeo sejak awal. Catatan saya tentang blokir ini tidak merekam masa berlaku sertifikat internetpositif.id itu, jadi saya tidak bisa memastikan apa persisnya yang membuat pesannya berbunyi kedaluwarsa.

Ada satu pembanding dari jaringan yang sama: fast.wistia.net dan api.wistia.com bisa dijangkau. Jam laptop yang melenceng biasanya membuat banyak situs gagal sekaligus, bukan satu penyedia saja.

Kenapa pemeriksaan sertifikat tidak dilewati

Kalau sertifikat yang datang milik filter, sambungannya pun berakhir di filter, bukan di Vimeo. Catatan saya merumuskannya sebagai pengandaian: melewati pengecekan sertifikat hanya akan mengambil halaman blokir filter. Catatan 12 Oktober juga menulis, di kalimat yang sama dengan penolakan certificate has expired tadi, bahwa pemeriksaannya tidak dilewati.

Akibatnya tidak berhenti di satu fitur. Rekaman Vimeo, di staging maupun di lokal, tidak bisa diputar atau dicek dari jaringan ini. Jalur Vimeo di skrip impor transkrip juga tidak bisa menjangkau API Vimeo dari sini. Catatan saya menyatakannya tanpa menyebut impor itu pernah dijalankan ke API Vimeo, dan api.vimeo.com memang ada di daftar lima host tadi. Pemutaran hanya bisa dicek oleh orang yang berada di luar filter, atau lewat VPN yang baru dipakai kalau saya sendiri yang memutuskan.

Fakta Vimeo dari salinan arsip dan GitHub

Karena help.vimeo.com dan developer.vimeo.com ikut terblokir, dokumentasi Vimeo tidak bisa dibuka langsung. Pada 12 Oktober, isi help.vimeo.com saya baca lewat hasil pencarian. Bersama temuan 13 Oktober, sebuah aturan masuk ke catatan saya: fakta tentang Vimeo dibaca dari sumber resmi yang masih bisa dijangkau. Sumber pertama adalah salinan help.vimeo.com di web.archive.org. Sumber kedua adalah repositori GitHub milik Vimeo, yaitu README vimeo/player.js, api.yaml di vimeo/openapi, dan vimeo/vimeo.js, yang dibaca lewat raw.githubusercontent.com atau api.github.com.

Dua sumber itu pula yang memberi bentuk alamat resmi Vimeo. Parameter resmi waktu mulai Vimeo adalah #t=1m2s di ujung alamat pemutar, menurut artikel help.vimeo.com "Start playback at a specific timecode" dan tabel "About Player Parameters". Halaman help.vimeo.com itu saya baca lewat salinan web.archive.org bertanggal 26 September dan 10 Oktober 2026. Menurut README resmi vimeo/player.js di GitHub, video Vimeo unlisted memakai ?h=<hash> di alamat pemutar.

API-nya dibaca dengan cara yang sama. Endpoint daftar track, GET https://api.vimeo.com/videos/{id}/texttracks, diambil dari spesifikasi resmi vimeo/openapi di GitHub untuk API versi 3.4. Menurut spesifikasi itu, tiap track punya link ke berkas teks, language, type berisi captions atau subtitles, dan active. Yang tidak bisa dipastikan adalah bentuk jawabannya, array polos atau dibungkus data, karena situs developer Vimeo diblokir. Jadi kodenya dibuat menerima keduanya. Gagasannya, dalam contoh minimal yang bukan kode proyek:

// contoh minimal dengan nama netral, bukan kode proyek
const tracks = Array.isArray(body) ? body : Array.isArray(body?.data) ? body.data : []

Contoh jawaban yang disimpan untuk test pun dibentuk dari skema resmi, bukan rekaman jawaban sungguhan, dan dicatat untuk diganti dengan jawaban asli begitu akun milik klien tersedia.

Yang bisa dicek hanyalah alamatnya

Untuk perubahan yang menyentuh Vimeo, aturan yang tercatat pendek saja: dari jaringan ini, perubahan itu hanya bisa dicek sebatas alamat yang dibangun kode, dan keterbatasan itu harus disebut di laporan.

Fungsi pembangun alamat embed di proyek menerima penyedia, ID video, dan opsi waktu mulai. Fungsi itu menulis #t=4m5s untuk Vimeo dan &time=245 untuk Wistia. Keduanya menunjuk detik yang sama, karena 4 × 60 + 5 = 245. Kalau dijajarkan dengan bentuk resmi tadi:

bentuk resmi Vimeo, waktu mulai    ...#t=1m2s      help.vimeo.com, lewat salinan arsip
bentuk resmi Vimeo, unlisted       ...?h=<hash>    README vimeo/player.js
dari kode, Vimeo                   ...#t=4m5s
dari kode, Wistia                  ...&time=245

Perbaikan untuk video Vimeo unlisted, yang mengganti %2F di alamat dengan ?h=, juga dikerjakan dengan cara ini. Perbaikan itu tidak bisa dicoba langsung karena Vimeo diblokir, dan dasarnya adalah bentuk alamat resmi.

Alat yang saya pakai untuk mengecek waktu mulai, start-time-shot.cjs, dibangun di atas batasan yang sama. Komentar di kepala skripnya menulis bahwa pemutaran Vimeo tidak bisa dicek dari jaringan ini karena diblokir, jadi yang dibaca adalah alamatnya. Ini tiga baris dari skrip itu:

// kumpulkan pesan error konsol
page.on('console', (message) => message.type() === 'error' && errors.push(message.text().slice(0, 160)))
 
// alamat pemutar diambil dari atribut src milik iframe pertama
player: document.querySelector('iframe')?.getAttribute('src') ?? null,
 
// jumlah error yang dicetak, tanpa pesan yang memuat "vimeo"
errors: errors.filter((text) => !/vimeo/i.test(text)).length

Baris terakhir perlu diingat saat membaca hasilnya. Pesan yang memuat kata vimeo, huruf besar maupun kecil, tidak ikut dihitung, jadi angka error nol dari alat ini tidak mengatakan apa pun tentang Vimeo.

Wistia sebagai pengganti, dari konteks browser yang baru

Sisi Wistia bisa diperiksa sungguhan, dan pengecekannya berjalan normal di Brave mode headed. Video penggantinya sebuah video Wistia publik. Supaya pemutar terlihat pada cek lokal di build produksi, satu item pustaka yang terbuka untuk sementara diberi video itu lewat psql pukul 19.52. Dua menit kemudian, pukul 19.54, item itu dikembalikan persis ke nilai aslinya, termasuk updated_at yang sama.

Hasilnya 18 tampilan: tiga bahasa (EN, FR, ES) di dua lebar (390 dan 1440) dengan tiga bentuk alamat, 3 × 2 × 3 = 18. Dengan ?t=245, alamat iframe berakhir &time=245, dan pemutar Wistia berhenti di detik 245 dengan status paused. Tanpa t dan dengan t=4:05, alamatnya tanpa time. Semua tampilan berstatus 200, tanpa geser ke samping, dan error konsolnya 0, dengan catatan bahwa angka itu sudah tidak menghitung pesan yang menyebut Vimeo.

Ada satu perilaku Wistia yang membuat urutan pengecekan ikut menentukan hasil. Sesudah video sekali dibuka di 4:05, kunjungan tanpa t melanjutkan dari 4:05, sedangkan konteks browser yang baru mulai dari 0. Catatan saya menamai perilaku ini fitur resumable milik Wistia untuk video 5 menit ke atas, tanpa mencatat dari mana ambang 5 menit itu diketahui. Karena itu, pengecekan waktu mulai memakai konteks browser yang baru. Di konteks yang lama, pemutar yang sudah berdiri di 4:05 bisa terbaca sebagai bukti bahwa parameter waktu mulai bekerja, padahal posisinya datang dari ingatan pemutar.

Yang belum terbukti

Blokirnya sendiri tidak hilang. Yang dipasang adalah cara kerja di sekitarnya, dan sisi Vimeo belum pernah diverifikasi lewat pemutaran. Rencana mencoba lompat bab dari jaringan yang bisa menjangkau Vimeo sudah tertulis sejak 21 September, tetapi daftar kerja yang ditulis ulang malam 13 Oktober masih mencatat bahwa pemutaran Vimeo tidak bisa dicek dari jaringan ini. Catatan saya tidak memuat pengujian lewat VPN atau oleh orang di luar filter. Di daftar yang sama, impor transkrip di staging baru dijalankan sesudah token Vimeo atau Wistia milik klien ada.

Kalau setiap host milik satu penyedia gagal dengan galat sertifikat, sementara penyedia lain di jaringan yang sama baik-baik saja, subjek sertifikatnya layak dibaca sebelum mengutak-atik jam laptop atau mematikan pemeriksaan. Di jaringan yang difilter, nama di sertifikat itu lebih banyak bercerita daripada pesan galatnya. Sesudah itu, pekerjaannya tinggal memisahkan apa yang bisa dibuktikan dari jaringan sendiri dan apa yang belum, lalu menuliskan batas itu di laporan.