Terkadang User ketika memakai aplikasi kita yang dibuat dengan Flutter mendapatkan error CERTIFICATE_VERIFY_FAILED ketika melakukan HIT API Request terutama ketika POST method. Permasalahan ini sering terjadi di Android versi 6 atau kebawah, tapi tidak semuanya atau random saja user yang mendapatkan error tersebut.

Contoh errornya:

1
HandshakeException: Handshake error in client (OS Error: CERTIFICATE_VERIFY_FAILED: certificate has expired(handshake.cc:354))

Untuk issue ini pada saat saya membuat artikel ini issue masalah CERTIFICATE_VERIFY_FAILED masih belum terpecahkan di Dart/Flutter, yang Anda bisa lihat di github

Pada kali ini Saya membagikan pengalaman ketika memperbaiki masalah ini pada kasus saya sebelumnya. Kasus saya sebelumnya padahal SSL(Secure Socket Layer) masih aktif tapi issue CERTIFICATE_VERIFY_FAILED ini malah muncul di sebagian Android. Berikut solusi-solusi yang Saya dapatkan:

1. Mengizin Semua Certificate (SSL) #

Langkah pertama Anda perlu membuat HttpOverrides sendiri, untuk handle certificate. Berikut contohnya:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
import 'dart:io';

class MyHttpOverrides extends HttpOverrides {
  @override
  HttpClient createHttpClient(SecurityContext? context) {
    return super.createHttpClient(context)
      ..badCertificateCallback =
          (X509Certificate cert, String host, int port) => true;
  }
}

Jangan lupa import dart:io ketika memanggil HttpOverrides.

Kemudian di function main() di file main.dart set HttpOverrides.global dengan HttpOverrides yang barusan dibuat. Taruh code ini di dalam function main dan letakkan di paling atas, contoh:

1
2
3
4
void main() {
	HttpOverrides.global = MyHttpOverrides();
    // ...
}

2. Ketika Menggunakan Dio Http Client #

Jika Anda menggunakan Dio sebagai Http Client di aplikasi Anda, Anda cukup letakkan kode ini sebelum menjalankan fungsi apapun, contoh:

1
2
3
4
5
6
7
8
9
void main() {
  final dio = Dio(); // variable ini yang akan anda gunakan untuk HIT API
  (dio.httpClientAdapter as DefaultHttpClientAdapter).onHttpClientCreate =
      (HttpClient client) {
    client.badCertificateCallback =
        (X509Certificate cert, String host, int port) => true;
    return client;
  };
}

Dan pastikan Anda membuat satu variable Dio yang Anda set ketika gagal memverifikasi cetificate, atau juga bisa menggunakan service locator atau dependency injection, yang nantinya akan diapakai ketika request ke server.

Berikut penjelasan singkat untuk mengatasi masalah CERTIFICATE_VERIFY_FAILED di Flutter semoga dengan adanya ini bisa membantu Anda, Terima Kasih :)


Jika terdapat kesalahan penulisan, typo, atau kurang sesuai dalam penulisan, bantu Saya untuk Edit on Github.


Wisnu G. Saputra avatar

Mobile Tech Enthusiast | Software Engineer | Blogger. Penggemar Teknologi di bidang Computer Science.

Support Me
Comment: