带有自签名证书的 Flutter https

Sco*_*ttF 4 java ssl https dart flutter

我正在使用flutter通过https连接java java服务器实现。我首先测试它是否仅使用 http 即可工作。

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

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

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

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

我的颤振应用程序中的 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}');
}
Run Code Online (Sandbox Code Playgroud)

Pas*_*rkl 7

在开发时,您可以使用badCertificateCallbackHttpClient 的回调并返回true。这将接受所有错误的证书。

  HttpClient client = HttpClient()
    ..badCertificateCallback = ((X509Certificate cert, String host, int port) => true);
Run Code Online (Sandbox Code Playgroud)

要接受特定的错误证书,您可以从此处尝试此代码: 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);
Run Code Online (Sandbox Code Playgroud)

  • 这段代码将如何在他的代码中实现?我遇到了类似的问题,我想继续使用 http 包,而不是 dart/io,因为我发现实现更容易阅读、更简单、更短 (9认同)

Wec*_*ski 5

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

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

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

然后在您的主目录中,将您的类实例化为全局 HttpOverride:

HttpOverrides.global = new DevHttpOverrides();
Run Code Online (Sandbox Code Playgroud)

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