사용자가 모바일 애플리케이션에서 애플리케이션을 실행할 때 떄때로 certificate_verift_failed 라는 오류가 무작위로 발생하기 시작합니다. 따라서 아래에 해결 방법을 설명하겠습니다.

 

내가 찾은 방법은 모든 인증서를 허용하는 것입니다.

main.dart 파일에서 다음 클래스를 추가하거나 가져옵니다.

class MyHttpOverrides extends HttpOverrides {

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

}

그 다음은 기본 함수에서 함수 정의 뒤에 다음 줄을 추가합니다.

    HttpOverrides.global = MyHttpOverrides();

 

dio 라이브러리를 사용하는 경우 아래와 같이 수행하면 됩니다.

Dio dio = new Dio();
(dio.httpClientAdapter as DefaultHttpClientAdapter).onHttpClientCreate =
    (HttpClient client) {
  client.badCertificateCallback =
      (X509Certificate cert, String host, int port) => true;
  return client;
};

 

혹은 아래와 같이 실행할 수 있습니다.

import 'package:http/io_client.dart';
import 'dart:io';
import 'package:http/http.dart';
import 'dart:async';
import 'dart:convert';

    Future getAccessToken(String url) async {
      try {
        final ioc = new HttpClient();
        ioc.badCertificateCallback =
            (X509Certificate cert, String host, int port) => true;
        final http = new IOClient(ioc);
        http.post('url', body: {"email": "xyz@xyz.com", "password": "1234"}).then(
            (response) {
          print("Reponse status : ${response.statusCode}");
          print("Response body : ${response.body}");
          var myresponse = jsonDecode(response.body);
          String token = myresponse["token"];
        });
      } catch (e) {
        print(e.toString());
      }
    }

 

가장 좋은 방법은 믿을수 있는 호스트로부터의 certificate 만 허용하는 것입니다.

그래서 만약 api host 가 api.my_app이라면 이 host만 허용합니다.

HttpClient client = new HttpClient();
client.badCertificateCallback = ((X509Certificate cert, String host, int port) {
 final isValidHost = host == "api.my_app";
 return isValidHost;
});

 

그래서 lib/_http/http.dart에서 Chopper로 직접 HttpClient를 전달할 수 없었습니다. ChopperClient는 ioclient.IOClient에 래핑된 생성자에서 HttpClient를 수신할 수 있습니다.

HttpClient webHttpClient = new HttpClient();
webHttpClient.badCertificateCallback = ((X509Certificate cert, String host, int port) => true);
dynamic ioClient = new ioclient.IOClient(webHttpClient);
final chopper = ChopperClient(
  baseUrl: "https://example.com",
  client: ioClient,
  services: [
    MfService.create()
  ],
  converter: JsonConverter(),
);
final mfService = MfService.create(chopper);

 

tls 1.3 request URL도 문제 없습니다.

import 'dart:io';

main() async {
  HttpClient client = new HttpClient();
  // tls 1.2 error
//  var request = await client.getUrl(Uri.parse('https://shop.io.mi-img.com/app/shop/img?id=shop_88f929c5731967cbc8339cfae1f5f0ec.jpeg')); 
  // tls 1.3 normal
  var request = await client.getUrl(Uri.parse('https://ae01.alicdn.com/kf/Ud7cd28ffdf6e475c8dc382380d5d1976o.jpg'));
  var response = await request.close();
  print(response.headers);
  client.close(force: true);
}

 

결론

KEEP FLUTTING!!!

+ Recent posts