Flutter Image.network(...)抛出HandshakeException

时间:2018-04-03 19:57:52

标签: dart flutter

我几天前开始使用颤动和飞镖,到目前为止一切顺利。非常好的工具,但对于应用程序,我需要从网络服务器获取图片,每当我试图用(int, wchar_t*, const wchar_t*)调用它时,抛出此异常:

HandshakeException: 客户端中的握手错误(操作系统错误:CERTIFICATE_VERIFY_FAILED:无法获取本地颁发者证书(ssl_cert.c:345))。

如果有人能帮助我,请提前致谢。

5 个答案:

答案 0 :(得分:6)

跳过ssl认证问题的最佳方法 它可以解决Image.network(url)问题

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

void main(){
    HttpOverrides.global = new MyHttpOverrides();
    runApp(new MyApp());
}

答案 1 :(得分:0)

您使用的是Windows并使用卡巴斯基防病毒软件吗?我不知道所有的技术细节,但这种防病毒以某种方式影响握手。禁用它应该会有所帮助。 此处提交了类似的问题,但我认为这不是Dart SDK问题:https://github.com/dart-lang/sdk/issues/32131

答案 2 :(得分:0)

这对我来说很好

var image = new Container(
    width: 100.0,
    height: 100.0,
    decoration: new BoxDecoration(
      borderRadius: new BorderRadius.circular(3.0),
      color: const Color(0xff7c94b6),
      image: new DecorationImage(
        image: new NetworkImage(
            "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRwlzVkvBV1EA_w87NFvYAhT-EC2HMRpfTuRFtHE7nXE5GPvnsQ"),
        fit: BoxFit.cover,
      ),
    ),
  );

请检查此answer以添加badCertificateCallback

_client = new HttpClient();
_client.badCertificateCallback = (X509Certificate cert, String host, int port) => true;

答案 3 :(得分:0)

我遇到同样的问题!能够解决它的应用程序(这是服务器相关的问题,因此最好在服务器端解决它!) sol:在本地添加用户信任证书!或跳过检查! 我选择添加证书。 将您的证书(针对您的特定域)添加为pubsec.yaml文件中的资产。 (您可以从网络浏览器中收集它)

assets:
   - assets/raw/certificate.pem

然后在发出网络请求之前,将以下代码添加到应用程序中的某处。例如,在主要功能中。

void main() async{
 await WidgetsFlutterBinding.ensureInitialized();
  ByteData data = await 
  rootBundle.load('assets/raw/certificate.pem');
  SecurityContext context = SecurityContext.defaultContext;
  context.setTrustedCertificatesBytes(data.buffer.asUint8List());
  runApp(MyApp());
}

答案 4 :(得分:-2)

运行flutter upgrade,问题就会消失。