我有一个Flutter应用程序,可以使用gRPC与服务器通信。服务器正在使用针对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);
最佳答案
在iOS上似乎没有明显的解决方案来添加受信任的自签名根CA。由于生产可能会有一个公共(public)信任的CA,因此您可以通过仅对开发禁用TLS验证来解决。
这是我的full example 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',
),
),
);
}
在这种情况下,我的服务器正在侦听
localhost:13100
。