GithubHelp home page GithubHelp logo

Comments (4)

AlexV525 avatar AlexV525 commented on June 20, 2024
  1. We no longer provide support to dio: <5.0.0.
  2. Do some search: https://www.mongodb.com/docs/atlas/device-sdks/sdk/flutter/troubleshooting/#connect-to-app-services-using-android-7-or-older

from dio.

ac169 avatar ac169 commented on June 20, 2024
  1. We no longer provide support to .dio: <5.0.0
  2. Do some search: https://www.mongodb.com/docs/atlas/device-sdks/sdk/flutter/troubleshooting/#connect-to-app-services-using-android-7-or-older

dio: ^5.0.0 was also tested and the problem remains! I have doubts that the signature algorithm for the certificate format does not support IP certificates, and the support is not perfect! But there is no documentation

According to the example, the following error is displayed:

DioException [unknown]: null
Error: HandshakeException: Handshake error in client (OS Error: 
	CERTIFICATE_VERIFY_FAILED: Hostname mismatch(../../third_party/boringssl/src/ssl/handshake.cc:393))

from dio.

ac169 avatar ac169 commented on June 20, 2024

Previously, the IP certificate was deployed on the HTTP server, now replace the certificate with the domain name certificate! Create a new test code in the test directory.

dio.httpClientAdapter = IOHttpClientAdapter(
      createHttpClient: () {
        SecurityContext securityContext =
            SecurityContext(withTrustedRoots: true);
        **securityContext.setTrustedCertificates('assets/ca-cert.crt'); or
        securityContext.useCertificateChainBytes(File('assets/ca-cert.crt').readAsBytesSync());**
        final client = HttpClient(
          context: securityContext,
        );
        client.badCertificateCallback = (cert, host, port) => true;

        return client;
      },
    );

This code will work in a separate test file with setTrustedCertificates and useCertificateChainBytes Settings. But placing the code in the project indicates that the certificate file is not found

I/flutter ( 6689): Error: FileSystemException: Cannot open file, path = 'assets/ca-cert.crt' (OS Error: No such file or directory, errno = 2)

from dio.

ac169 avatar ac169 commented on June 20, 2024
  1. Dio (HttpClient) certificate authentication The support for IP certificate authentication is not perfect.

  2. Using File('assets/ca.crt').readAsBytesSync() or await rootBundle.load("assets/ca.crt") in the Widget neither of these methods work properly FileSystemException: Cannot open file. But it works fine until the main function calls runApp(const App()), I don't know why!

  3. In the main () function configuration HttpOverrides. The method of HttpOverrides.global = _HttpOverrides _HttpOverrides. createHttpClient will be multiple calls even if I just call the HTTP request at a time, Setting the certificate is also invalid, and this method is only suitable for ignoring the certificate globally.

The solution:
Adds a global variable, initialized before runApp(const App()).Use this global variable where http requests are required

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  var chainBytes = await rootBundle.load("assets/ca.crt");

  Global.dio.httpClientAdapter = IOHttpClientAdapter(
    createHttpClient: () {
      SecurityContext securityContext = SecurityContext(withTrustedRoots: true);
      securityContext.setTrustedCertificatesBytes(chainBytes.buffer.asUint8List());
      // securityContext.useCertificateChainBytes(chainBytes.buffer.asUint8List());
      final client = HttpClient(
        context: securityContext,
      );
      // client.badCertificateCallback = (cert, host, port) => true;

      return client;
    },
  );

  runApp(const BiliApp());
}

This may not be the best way but it's the one I can think of right now.

from dio.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.