仅网络目标。使用自签名证书查询服务器时 flutter web 项目上的 XMLHttpRequest (CORS) 异常

问题描述 投票:0回答:0

仅针对 Web 构建确定了该问题。 具有自签名证书的 Web 配置可用于封闭的企业部分。而且 flutter web assembly 的 web 平台现在不好 :(.

重现问题很简单:

docker pull pawga777/pawga_ssl_demo:0.0.1 docker run -d -p 8443:8443 pawga777/pawga_ssl_demo:0.0.1
接下来,让 flutter client 返回最简单请求的答案:
https://localhost:8443/actuator/health

预期结果: 请求“https://localhost:8443/actuator/health”:

{ "status": "UP" }

实际结果: 请求“https://localhost:8443/actuator/health”:

XMLHttpRequest error.
自签名证书

普通证书:

我写了两个公共应用程序来重现问题: flutter 客户端“Java Spring Boot 后端”。后端服务器由docker实现,可以从docker hub下载。服务器代码可以在上面的链接中查看。

最简单的例子:

变体 1:

import 'package:dio/dio.dart';

void main() async {
  final dio = Dio();
  final response = await dio.get('https://localhost:8443/actuator/health');
  print(response.data);
}

变体 2:

import 'dart:convert' as convert;

import 'package:http/http.dart' as http;

void main(List<String> arguments) async {

  var url =
  Uri.https('localhost:8443', 'actuator/health');

  var response = await http.get(url);
  if (response.statusCode == 200) {
    var jsonResponse =
    convert.jsonDecode(response.body) as Map<String, dynamic>;
    var itemCount = jsonResponse['totalItems'];
    print('Number of books about http: $itemCount.');
  } else {
    print('Request failed with status: ${response.statusCode}.');
  }
}
日志

Unhandled exception:
DioError [unknown]: null
Error: HandshakeException: Handshake error in client (OS Error: 
    CERTIFICATE_VERIFY_FAILED: self signed certificate(handshake.cc:393))
#0      DioMixin.fetch.<anonymous closure> (package:dio/src/dio_mixin.dart:532:7)
#1      _RootZone.runUnary (dart:async/zone.dart:1660:54)
#2      _FutureListener.handleError (dart:async/future_impl.dart:165:22)
#3      Future._propagateToListeners.handleError (dart:async/future_impl.dart:779:47)
#4      Future._propagateToListeners (dart:async/future_impl.dart:800:13)
#5      Future._completeError (dart:async/future_impl.dart:575:5)
#6      _SyncCompleter._completeError (dart:async/future_impl.dart:51:12)
#7      _Completer.completeError (dart:async/future_impl.dart:23:5)
#8      Future.any.onError (dart:async/future.dart:617:45)
#9      _RootZone.runBinary (dart:async/zone.dart:1665:54)
#10     _FutureListener.handleError (dart:async/future_impl.dart:162:22)
#11     Future._propagateToListeners.handleError (dart:async/future_impl.dart:779:47)
#12     Future._propagateToListeners (dart:async/future_impl.dart:800:13)
#13     Future._completeError (dart:async/future_impl.dart:575:5)
#14     Future._asyncCompleteError.<anonymous closure> (dart:async/future_impl.dart:666:7)
#15     _microtaskLoop (dart:async/schedule_microtask.dart:40:21)
#16     _startMicrotaskLoop (dart:async/schedule_microtask.dart:49:5)
#17     _runPendingImmediateCallback (dart:isolate-patch/isolate_patch.dart:123:13)
#18     _Timer._runTimers (dart:isolate-patch/timer_impl.dart:405:11)
#19     _Timer._handleMessage (dart:isolate-patch/timer_impl.dart:429:5)
#20     _RawReceivePort._handleMessage (dart:isolate-patch/isolate_patch.dart:192:26)

Process finished with exit code 255

Variant 2:
Unhandled exception:
HandshakeException: Handshake error in client (OS Error: 
    CERTIFICATE_VERIFY_FAILED: self signed certificate(handshake.cc:393))
#0      _SecureFilterImpl._handshake (dart:io-patch/secure_socket_patch.dart:99:46)
#1      _SecureFilterImpl.handshake (dart:io-patch/secure_socket_patch.dart:142:25)
#2      _RawSecureSocket._secureHandshake (dart:io/secure_socket.dart:915:54)
#3      _RawSecureSocket._tryFilter (dart:io/secure_socket.dart:1044:19)
<asynchronous suspension>


Flutter Doctor 输出

医生输出
[✓] Flutter (Channel stable, 3.7.11, on Linux Mint 20.1 5.4.0-146-generic, locale ru_RU.UTF-8)
    • Flutter version 3.7.11 on channel stable at /home/sivannikov/flutter
    • Upstream repository https://github.com/flutter/flutter.git
    • Framework revision f72efea43c (5 дней назад), 2023-04-11 11:57:21 -0700
    • Engine revision 1a65d409c7
    • Dart version 2.19.6
    • DevTools version 2.20.1

[✓] Android toolchain - develop for Android devices (Android SDK version 33.0.1)
    • Android SDK at /home/sivannikov/Android/Sdk
    • Platform android-33, build-tools 33.0.1
    • Java binary at: /home/sivannikov/android-studio/jbr/bin/java
    • Java version OpenJDK Runtime Environment (build 17.0.6+0-17.0.6b802.4-9586694)
    • All Android licenses accepted.

[✓] Chrome - develop for the web
    • Chrome at google-chrome

[✓] Linux toolchain - develop for Linux desktop
    • clang version 10.0.0-4ubuntu1
    • cmake version 3.16.3
    • ninja version 1.10.0
    • pkg-config version 0.29.1

[✓] Android Studio (version 2022.2)
    • Android Studio at /home/sivannikov/android-studio
    • Flutter plugin version 73.0.2
    • Dart plugin version 222.4560
    • Java version OpenJDK Runtime Environment (build 17.0.6+0-17.0.6b802.4-9586694)

[✓] IntelliJ IDEA Ultimate Edition (version 2023.1)
    • IntelliJ at /home/sivannikov/.local/share/JetBrains/Toolbox/apps/IDEA-U/ch-0/231.8109.175
    • Flutter plugin version 73.0.4
    • Dart plugin version 222.4459.16

[✓] IntelliJ IDEA Ultimate Edition (version 2022.3)
    • IntelliJ at /home/sivannikov/.local/share/JetBrains/Toolbox/apps/IDEA-U/ch-0/223.8836.41
    • Flutter plugin version 72.1.4
    • Dart plugin version 222.4459.16

[✓] VS Code (version 1.77.3)
    • VS Code at /usr/share/code
    • Flutter extension can be installed from:
      🔨 https://marketplace.visualstudio.com/items?itemName=Dart-Code.flutter

[✓] Connected device (2 available)
    • Linux (desktop) • linux  • linux-x64      • Linux Mint 20.1 5.4.0-146-generic
    • Chrome (web)    • chrome • web-javascript • Google Chrome 112.0.5615.121

[✓] HTTP Host Availability
    • All required HTTP hosts are available

• No issues found!

禁用浏览器安全的选项不好。你需要一个专门用于 web assembly 的工作版本。

flutter web cors xmlhttprequest
© www.soinside.com 2019 - 2024. All rights reserved.