【问题标题】:Flutter Websocket client ssl handshake failureFlutter Websocket客户端ssl握手失败
【发布时间】:2020-07-17 13:05:03
【问题描述】:

服务器工作正常,用 echo 客户端测试。

当我使用以下方式运行我的应用程序时,仍然可以:

 final channel = IOWebSocketChannel.connect("wss://hostname:port");
    channel.sink.add('test');
    channel.stream.listen((message) {
      debugPrint(message);
      channel.sink.close(status.goingAway);

带有此重复消息的调试控制台异常:

E/flutter (19705): [ERROR:flutter/lib/ui/ui_dart_state.cc(166)] Unhandled Exception: WebSocketChannelException: WebSocketChannelException: HandshakeException: Handshake error in client (OS Error: 
E/flutter (19705):  CERTIFICATE_VERIFY_FAILED: unable to get local issuer certificate(handshake.cc:354))

我尝试了多种方式让我的 Flutter 应用信任 Let`s Encrypt CA,但均未成功。

对解决我的问题的任何回应将不胜感激!

【问题讨论】:

  • 我的猜测是该站点设置不正确,即证书错误或缺少中间证书。并且回显客户端可能会简单地忽略这些问题(浏览器通常会解决缺少中间证书的问题,而其他人则不会)。如果您愿意提供实际的主机名和端口,并且可能能够提供更多详细信息,但您也可以尝试与SSLLabs 核对 - 但请确保使用与目标相同的端口。
  • 根据 SSLLabs:只有我的 DNS CAA 不完整,它也只使用 TLS 1.2
  • DNS CAA 和 TLS 1.2 仅与证书验证无关。
  • 那我知道怎么了,这很令人沮丧,我必须进行加密通信。奇怪的是,有时客户端正在与服务器建立 ssl 握手,但大多数时候,都会显示异常。
  • 引用我自己的话:“如果您愿意提供实际的主机名和端口,并且可能能够提供更多详细信息......”。没有这些细节,就不可能说出哪里出了问题。如果它有时但并不总是有效,那么这些场景中的区别是什么会很有趣。不同的网络?

标签: java flutter ssl dart ca


【解决方案1】:
    class MyHttpOverrides extends HttpOverrides {
  @override
  HttpClient createHttpClient(SecurityContext context) {
    return super.createHttpClient(context)
      ..badCertificateCallback =
          (X509Certificate cert, String host, int port) => true;
  }
}

void main() {
  HttpOverrides.global = new MyHttpOverrides();
  runApp(MyApp());
}

【讨论】:

    【解决方案2】:

    好的,我一周前修复了它,忘记发布答案。 这更像是一种解决方法,但它仍然很稳定...... 我使用了一个使用反向代理到 websocket 服务器的 apache2 网络服务器。 现在 apache 服务器已经有了证书,我在 openssl 上使用 s_client 来检查浏览器/客户端是否接受证书,它是在我使用 apache2 作为反向代理之后完成的。

    【讨论】:

      猜你喜欢
      • 2015-03-16
      • 1970-01-01
      • 1970-01-01
      • 2016-01-18
      • 2016-09-23
      • 2018-05-15
      • 2021-09-07
      • 2015-12-08
      • 2016-11-19
      相关资源
      最近更新 更多