【问题标题】:Flutter https with self signed certificate带有自签名证书的 Flutter https
【发布时间】:2020-04-24 14:04:12
【问题描述】:

我正在使用颤振通过 https 连接 java java 服务器实现。我首先测试它只使用 http。

然后我在服务器端切换到 https 并将其指向我使用 keytool 创建的自签名证书。

然后我尝试使用 http dart 包连接到它。结果导致以下异常...

未处理的异常:HandshakeException:客户端中的握手错误(操作系统 错误:E/flutter(7370):CERTIFICATE_VERIFY_FAILED:自签名 证书(handshake.cc:354))

我假设我需要将我的客户端设置为信任我的服务器自签名证书。我查看了 APi 参考,但不知道如何实现这一点......

我在 Flutter 应用中的 dart 代码如下...

void testMessage() {
    var url = 'https://192.168.100.105:8443';
    var response = await http.post(url, body: "{\"message_name\": \"TestMessage\", \"contents\": { \"field1\":\"blah\", \"field2\":\"blah\" }}");
    print('Response status: ${response.statusCode}');
    print('Response body: ${response.body}');
}

【问题讨论】:

    标签: java ssl flutter dart https


    【解决方案1】:

    了不起的@Wecherowski,我认为更安全的方法是检查其他详细信息并返回 true。

    类似:

    HttpClient createHttpClient(SecurityContext? context)
     {
        return super.createHttpClient(context)
           ..badCertificateCallback = (X509Certificate cert, String host, int port)
           {
             if (host.isNotEmpty && host == 'xyz.example.com')
               {  
                   return true;  
               }  
               else  
               {  return false;  }  
     };
    

    【讨论】:

      【解决方案2】:

      虽然 Pascal 的答案有效,但它仅适用于 dart:io HttpClient。 要将badCertificateCallback 应用于http 包的Client 实例,请执行以下操作:

      通过以下方式创建一个覆盖HttpOverrides 的类:

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

      然后在你的 main 中,将你的类实例化为全局 HttpOverride:

      HttpOverrides.global = new DevHttpOverrides();
      

      这应该使所有客户端忽略错误的证书,因此仅在开发中被推荐。 归功于这个问题:https://github.com/dart-lang/http/issues/458

      【讨论】:

        【解决方案3】:

        如果你使用 dio 库 https://pub.dev/packages/dio 你可以从 http 向 https 发出请求

        【讨论】:

        • 请不要只发布一些工具或库作为答案。至少在答案本身中展示how it solves the problem
        • 没有解决问题的特殊方法,@Yunnosch,仅使用这个库就不会出现问题。在决定使用哪个库之前,这对我很有帮助,所以我把它作为答案,以防它帮助其他人
        【解决方案4】:

        在开发过程中,您可以使用 HttpClient 的 badCertificateCallback 回调并返回 true。这将接受所有错误的证书。

          HttpClient client = HttpClient()
            ..badCertificateCallback = ((X509Certificate cert, String host, int port) => true);
        

        要接受特定的错误证书,您可以从这里试用此代码:https://github.com/dart-lang/http/issues/14#issuecomment-311184690

        import 'dart:io';
        import 'package:http/http.dart' as http;
        
        bool _certificateCheck(X509Certificate cert, String host, int port) =>
            host == 'local.domain.ext'; // <- change
        
        HttpClient client = new HttpClient()
            ..badCertificateCallback = (_certificateCheck);
        

        【讨论】:

        • 那么这个 sn-p 将如何在他的代码中实现呢?我遇到了类似的问题,我想继续使用 http 包,而不是 dart/io,因为我发现实现更容易阅读、更简单、更短
        猜你喜欢
        • 1970-01-01
        • 2014-05-05
        • 2021-03-17
        • 1970-01-01
        • 1970-01-01
        • 2013-11-25
        • 1970-01-01
        • 1970-01-01
        • 2017-02-19
        相关资源
        最近更新 更多