Flutter 上 gRPC 的自签名证书

Nik*_*chi 2 ssl self-signed dart grpc flutter

我有一个使用 gRPC 与服务器通信的 Flutter 应用程序。服务器正在为 TLS 使用自签名证书。我已将证书添加到我的 Flutter 应用程序中,这适用于 Android。但是在 iOS 上,我收到 CERTIFICATE_VERIFY_FAILED 错误。iOS 只是不允许自签名证书吗?

我正在按如下方式设置我的 gRPC 客户端:

    var cert = await rootBundle.load('assets/cert.crt');
    var creds = ChannelCredentials.secure(
        certificates: cert.buffer.asUint8List().toList()
    );
    var channel = ClientChannel(
        host,
        port: port,
        options: new ChannelOptions(credentials: creds));
    return GrpcClient(channel);

Run Code Online (Sandbox Code Playgroud)

And*_*Dog 7

在 iOS 上似乎没有明显的解决方案来添加受信任的自签名根 CA。由于生产可能有一个公开信任的 CA,您可以通过禁用 TLS 验证来解决此问题,用于开发。

这是我的完整示例 repo的相关片段:

Future<ClientChannel> makeChannel() async {
  final caCert = await rootBundle.loadString('assets/pki/ca/ca.crt');

  return ClientChannel(
    'localhost',
    port: 13100,
    options: ChannelOptions(
      credentials: ChannelCredentials.secure(
        certificates: utf8.encode(caCert),

        // --- WORKAROUND FOR SELF-SIGNED DEVELOPMENT CA ---
        onBadCertificate: (certificate, host) => host == 'localhost:13100',
      ),
    ),
  );
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我的服务器正在侦听localhost:13100.