仅针对 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 的工作版本。