본문 바로가기

소소한 팁

Flutter(dart) https SSL 인증서 오류 (proxy, self-signed 인증서)

Flutter 또는 dart에서 https 통신 시에, 다음과 같은 인증서 오류가 발생하는 경우가 있습니다.

E/flutter (22784): [ERROR:flutter/lib/ui/ui_dart_state.cc(209)] Unhandled Exception: HandshakeException: Handshake error in client (OS Error:
E/flutter (22784):   CERTIFICATE_VERIFY_FAILED: unable to get local issuer certificate(handshake.cc:393))
E/flutter (22784): #0    _SecureFilterImpl._handshake (dart:io-patch/secure_socket_patch.dar:104:46)
E/flutter (22784): #1    _SecureFilterImpl.handshake (dart:io-patch/secure_socket_patch.dart:147:25)
E/flutter (22784): #2    _RawSecureSocket._secureHandshake (dart:io/secure_socket.dart:803:54)
E/flutter (22784): #3    _RawSecureSocket._tryFilter (dart:io/secure_socket.dart:933:19)
…

테스트나 내부용으로 사용되는 SSL 인증서 또는 proxy를 통해 인터넷에 연결된 경우 등에 발생할 수 있죠.

이 경우, http와 관련된 어떤 패키지를 사용하던지, 다음과 같은 HttpOverrides 객체를 생성 및 지정해 주시면 됩니다.

void main() {
  HttpOverrides.global = NoCheckCertificateHttpOverrides(); // 생성된 HttpOverrides 객체 등록
  // ..
}

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


물론, 아무 통신이나 잘못된 인증서 유효성을 무시하는 것은 위험할 수 있으니, 제한된 환경이나 또는 특정 상황에서만 적용하셔야 합니다.

Written with by Vincent Han