Flutter证书锁定插件flutter_certificate_pinning的使用

Flutter证书锁定插件flutter_certificate_pinning的使用

https://pub.dartlang.org/packages/flutter_certificate_pinning

HTTPS证书验证或Dio库中的公钥锁定。

如何使用

获取SHA256证书指纹

flutter test test/flutter_certificate_pinning_test.dart

输出结果:

ExpiredAt: Dec 11 08:19:25 2023 GMT
Fingerprints: [b235f7c569490f2b2b861d2237e303337fe45a80ffec55dc140abda69e843d51]

SHA256证书指纹类

class Sha256CertificateFingerprint extends CertificateFingerprint {
  @override
  Future<List<String>> fingerprints() async {
    return [
      // ExpiredAt: Dec 11 08:19:25 2023 GMT
      'b235f7c569490f2b2b861d2237e303337fe45a80ffec55dc140abda69e843d51',
    ];
  }
}

自定义验证器

class SelfCustomValidator implements CustomValidator {
  @override
  bool validate(X509Certificate cert, String host, int port) {
    final hostMatches = _validateHost(host);
    return hostMatches;
  }

  bool _validateHost(String host) {
    return 'google.com' == host;
  }
}

证书信任配置(可选)

class LocalCertificateTrustedConfiguration implements CertificateTrustedConfiguration {
  @override
  List<List<int>> certificates() {
    // Certificate bytes
    return [];
  }
}

使用示例

void main() {
  // 创建证书信任配置
  final certificateTrustedConfiguration = LocalCertificateTrustedConfiguration();

  // 创建SHA256证书指纹对象
  final sha256CertificateFingerprint = Sha256CertificateFingerprint();

  // 创建自定义验证器
  final selfCustomValidator = SelfCustomValidator();

  // 创建证书验证器
  final certificateValidator = SelfCertificateValidator(selfCustomValidator);

  // 创建安全HTTP客户端创建器
  final securityHttpClientCreator = SecurityHttpClientCreator(
    certificateValidator,
    certificateTrustedConfiguration: certificateTrustedConfiguration,
  );

  // 创建HTTPS证书验证对象
  final httpsCertificateVerification = HttpsCertificateVerification(
    securityHttpClientCreator,
    certificateValidator,
    sha256CertificateFingerprint,
  );

  // 创建Dio实例
  final dio = Dio();

  // 配置Dio实例以使用HTTPS证书验证
  httpsCertificateVerification.config(dio);

  // 现在你可以使用dio发送请求了
  dio.get('https://google.com').then((response) {
    print(response.data);
  }).catchError((error) {
    print(error);
  });
}

更多关于Flutter证书锁定插件flutter_certificate_pinning的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter证书锁定插件flutter_certificate_pinning的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中使用flutter_certificate_pinning插件来实现证书锁定的示例代码。这个插件允许你为你的应用指定一组受信任的证书,从而防止中间人攻击(MITM)。

首先,你需要确保你的Flutter项目已经创建并配置好了。然后,你可以按照以下步骤来添加和使用flutter_certificate_pinning插件。

1. 添加依赖

在你的pubspec.yaml文件中添加flutter_certificate_pinning依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_certificate_pinning: ^x.y.z  # 请替换为最新版本号

然后运行flutter pub get来安装依赖。

2. 配置证书

将你的证书(通常是.pem.crt文件)放置在Flutter项目的assets目录中。如果assets目录不存在,你可以手动创建。

例如,将你的证书命名为trusted_cert.pem并放在assets目录下。

3. 更新pubspec.yaml以包含证书文件

pubspec.yaml文件的flutter部分添加证书文件到assets

flutter:
  assets:
    - assets/trusted_cert.pem

4. 使用插件进行证书锁定

在你的Dart代码中,配置并使用flutter_certificate_pinning插件。通常,你会在应用的初始化部分进行配置。

import 'package:flutter/material.dart';
import 'package:flutter_certificate_pinning/flutter_certificate_pinning.dart';
import 'dart:io';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  // 配置证书锁定
  await FlutterCertificatePinning.configure(
    certificates: [
      // 你可以添加多个受信任的证书
      PlatformAssetBundle().loadString('assets/trusted_cert.pem')!
    ],
    validate: (certificateChain, hostname) async {
      // 这里可以添加额外的验证逻辑,如果返回true,则继续;如果返回false,则抛出异常
      // 例如,你可以检查证书链中的某个证书是否匹配特定的颁发机构
      return true;
    },
    onFail: (error) {
      // 证书验证失败时的处理逻辑
      print("Certificate pinning failed: $error");
      // 你可以在这里显示错误提示给用户,或者执行其他操作
    },
  );

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter Certificate Pinning Example'),
        ),
        body: Center(
          child: Text('Check console for certificate pinning status.'),
        ),
      ),
    );
  }
}

5. 进行网络请求

现在,你的应用已经配置了证书锁定。当你进行网络请求时,flutter_certificate_pinning插件将自动验证服务器证书是否与你的受信任证书匹配。

例如,使用dio库进行HTTP请求:

import 'package:dio/dio.dart';

void makeRequest() async {
  var dio = Dio();
  try {
    Response response = await dio.get('https://your-api-endpoint.com');
    print(response.data);
  } catch (e) {
    print("Request failed: $e");
  }
}

你可以在MyAppbuild方法或其他合适的地方调用makeRequest函数。

注意事项

  • 确保你的证书是最新的,并且是从可信的颁发机构获取的。
  • 在生产环境中,务必测试证书锁定配置,以确保它按预期工作。
  • flutter_certificate_pinning插件可能不支持所有平台,请查阅其官方文档以获取更多信息。

通过上述步骤,你就可以在Flutter应用中使用flutter_certificate_pinning插件来实现证书锁定了。

回到顶部