1

I am building a flutter web app and I need to use SSL to talk to the server using a .pem certificate.

I am using HttpClient and IOClient to get it to work and the code for this looks as following:

fetchData()async{
    HttpClient _client = HttpClient(context: await globalContext);
    _client.badCertificateCallback =
        (X509Certificate cert, String host, int port) => false;
    IOClient _ioClient = new IOClient(_client);
    var response = await _ioClient.get(Uri.parse('https://appapi2.test.bankid.com/rp/v5.1'));
    print(response.body);
  }

  Future<SecurityContext> get globalContext async {
    final sslCert1 = await
    rootBundle.load('assets/certificates/bankid/cert.pem');
    SecurityContext sc = new SecurityContext(withTrustedRoots: false);
    sc.setTrustedCertificatesBytes(sslCert1.buffer.asInt8List());
    return sc;
  }

I get the following error when trying to run fetchData:

Unsupported operation: SecurityContext constructor

I have also tried using the flutter plugin DIO that looks like this:

void bid() async {
    final dio = Dio();
    ByteData bytes = await rootBundle
        .load('assets/certificates/bankid/FPTestcert4_20220818.pem');
    (dio.httpClientAdapter as DefaultHttpClientAdapter).onHttpClientCreate =
        (client) {
      SecurityContext sc = SecurityContext();
      sc.setTrustedCertificatesBytes(bytes.buffer.asUint8List());
      HttpClient httpClient = HttpClient(context: sc);
      return httpClient;
    };
    try {
      var response = await dio.get('https://appapi2.test.bankid.com/rp/v5.1');
      print(response.data);
    } catch (error) {
      if (error is DioError) {
        print(error.toString());
      } else {
        print('Unexpected Error');
      }
    }
  }

When running this I get the following error:

Error: Expected a value of type 'DefaultHttpClientAdapter', but got one of type
'BrowserHttpClientAdapter'

I understand that I get the error above because of the casting that the httpClientAdapter is used as a DefaultHttpClientAdapter but since the app is running in the browser its using BrowserHttpClientAdapter, but how do I solve this?

Is it possible to make this work?

codemoonger
  • 613
  • 3
  • 11
  • 22

0 Answers0