사용자가 모바일 애플리케이션에서 애플리케이션을 실행할 때 떄때로 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!!!
'FLUTTER' 카테고리의 다른 글
플러터 png 파일 꽉찬 화면 (flutter png full screen) (0) | 2023.01.17 |
---|---|
[ERROR]The argument type 'Object' can't be assigned to the parameter type 'PostStatus'. (0) | 2022.11.14 |
[ERROR]One or more plugins require a higher Android SDK version. (0) | 2022.11.02 |
FLUTTER 패키지 추천해주는 사이트! (0) | 2022.10.07 |
is 와 == 연산자의 차이 (2) | 2022.10.05 |