ssl Dio https请求中的Flutter错误,HandshakeException:客户端操作系统中的握手错误错误:(TLSV1_ALERT_DECODE_ERROR(tls_record.cc:594))

wb1gzix0  于 2023-05-18  发布在  Flutter
关注(0)|答案(1)|浏览(460)

我正在尝试使用以下函数从flutter发送https请求:

Future<void> sendOTP(PhoneNumber phoneNumber) async {
    try {
      final String url = 'https://127.0.0.1:5432/api/send_otp';

      final response = await _dio.post(
        url,
        data: {'number': 1234567890},
        options: Options(
          headers: {
            'Content-Type': 'application/json',
          },
        ),
      );

      if (response.statusCode != 200) {
        throw Exception("Failed to send OTP: ${response.statusCode}");
      }
    } on DioError catch (e) {
      throw Exception("Failed to send OTP: ${e.error.toString()}");
    }
  }

为了启用ssl certificate,我在main方法中添加了以下代码:

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  ByteData data = await PlatformAssetBundle().load('asset/certificate/certificate.pem');
  SecurityContext.defaultContext
      .setTrustedCertificatesBytes(data.buffer.asUint8List());
  runApp(const MyApp());
}

我已经从https://letsencrypt.org/certs/lets-encrypt-r3.pem下载了certificate.pem文件。
当我使用thunderclientpostman与证书发送请求时,它可以工作,但从flutter应用程序中,它会抛出以下错误:

Error: HandshakeException: Handshake error in client (OS Error:
    TLSV1_ALERT_DECODE_ERROR(tls_record.cc:594))

对于服务器,我使用actix-webrustls-如果相关的话。请建议我如何修复相同的?

cyvaqqii

cyvaqqii1#

我也有类似的问题,经过几个小时的研究,我发现:

  • 如果您在默认配置中有一个Android模拟器,您必须能够通过以下IP地址从模拟器的浏览器访问您的URL:根据文档,这是本地主机(您的机器)的别名。
  • 我改变了我的asp.net API配置,以响应本地机器的wi-fi ip地址,在我的情况下是192.168.100.2,你可以看到在下面的图片:

正如你所看到的,我的API是由android模拟器访问的,但是如果我使用Dio Http(版本5.1.1)运行我的flutter代码,它会抛出一个Handshake异常。我尝试了与您使用的完全相同的代码,添加了一个证书,但没有任何变化。我真的不知道从现在开始该怎么办。这真的很令人沮丧,也许我将不得不使用浏览器而不是模拟器来开发我的应用程序。
这是我的dio基本选项配置,这是确定的:

这是Dio Http抛出的异常:

我还试图在android清单中添加互联网权限,但没有任何变化,我还试图指向我的API的http版本,但发生了同样的错误。这可能是Dio Http的一个bug。

相关问题