Flutter运行第一个项目时出现javax.net.ssl.SSLHandshakeException的一些解决思路

1 篇文章 0 订阅
1 篇文章 0 订阅

前言

我其实是很不想写这篇文章的,因为这个错误实际上我并没有深入搞明白其中的机制,也没有找到一个非常优雅的解决方法。虽然经过一天的查找资料和各种尝试最后莫名其妙的解决,但是确实是不知其原因。。

只是这个问题实在是过于恶心,网上的相关帖子数不胜数,而我至少看了几十个经验帖,包括github,stackoverflow以及各个国内网站。解决方法层出不穷,却没有一个对我有效。。因此我还是写一写我的一些思路。也许未来刚好会有人和我情况类似然后用这篇博客的思路解决。

需求

需求很简单,按照这个教程走到“体验flutter那节”,把第一个创建的demo在Android Studio上运行起来。
入门: 在Windows上搭建Flutter开发环境

环境

Andriod Studio:4.0
Flutter SDK:1.17.3

前期准备及问题

关于下载Android Studio,下载Android SDK,配置Android AVD,下载Flutter SDK等这里都不再谈。我们直接从Android Studio创建好了一个Flutter Project开始。

点击运行,出现错误。
javax.net.ssl.SSLHandshakeException、

Exception in thread "main" javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
.......
Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target   
.......

经典的SSL证书错误,之前写过一篇博客Spring Boot配置时遇到javax.net.ssl.SSLHandshakeExcecepton: … ValidatorException: PKIX path…错误解决,读者可以从那篇博客和它引用的博客中看一下对那个问题的具体说明。

但是比较麻烦的是,这次在Flutter里面run项目,Flutter和Andriod Studio或者IDEA的项目都不太一样,至少我gradle sync的时候下面的弹出框没有弹出来,提示的信息也不告诉我到底是哪个依赖下载不下来。

要是知道是哪个依赖下载不下来也就好了,就可以直接导出证书然后再加到Android Studio里。可是Flutter项目偏偏不给这个信息。

解决思路

运行Flutter项目中的子Android项目

偶然间,我发现,Flutter项目的目录下的andriod目录下是一个完整的Andriod项目,可以使用Android Studio打开,并且运行后和直接运行整个Flutter项目效果是一样的。

Flutter项目如下:
在这里插入图片描述
用Android Studio打开其中的android目录,如下
在这里插入图片描述
在我的电脑上,当我使用对android目录中的Android项目进行直接build时,终于Android Studio开始给我弹出正在download xxx 的信息,虽然最后还是以SSLHandshakeException,但这一次出现了can’t get https://…这样的具体网址。

解决can’t get https://…问题

无法下载资源问题。一般来说有两种情况,一种是外网资源访问受限,另一种是确实没有SSL证书导致即使能访问也无法创立连接下载。

外网资源访问受限问题解决

思路1:

通过改hosts文件,将要下载的网址改成能在国内访问的IP.

具体可参考这篇博客:解决连不上dl.google.com的问题

其中找到某个DNS对应的IP可以通过“站长之家”来搞定,另外就是我实验中在hosts文件的最后自己加上的那行前面也应该有个#才对。

优点:用途广泛、灵活
缺点:一次只能配置单一DNS,可用IP地址一段时间后可能发生变化,麻烦。

思路2:

用各个大厂、高校提供的镜像

华为开源镜像站
阿里云官方镜像站

在国内使用镜像绝对是最舒服的获得外网资源的方式了。想pip、npm什么的都搞成镜像最好了。镜像具体怎么用就不介绍了,网上帖子很多。

优点:方便、快捷、稳定
缺点:目录组织有时反人类,一些包可能找不到。后面还有镜像方式和vpn方式的专门对比。

思路3

使用vpn。

这里不提供任何vpn网址或推荐。只讨论在有vpn的情况下和镜像方式的优缺点。

使用镜像,很可能会出现某一个冷门依赖不在镜像库中,或者一个依赖不在当前镜像库中而在另一个镜像库中的情况。比如我之前曾经为另一个项目如此配置过build.gradle:

repositories {
    maven { url 'https://maven.aliyun.com/repository/public/' }
    maven { url 'https://maven.aliyun.com/repository/spring/'}
	maven{ url 'http://maven.aliyun.com/nexus/content/repositories/jcenter'}
}

一般大部分网上博客都是只配置https://maven.aliyun.com/repository/public/就完事了,谁能想到某些生成的依赖里竟然不在public里,而在阿里云的其他库里呢?

而用vpn就可以很好的解决这一点,vpn就不用局限于国内厂商的目录和对依赖的支持度了,只要配置文件是人写的,有了vpn理论上肯定能直接全部下载下来。

但是vpn也有一个问题,就是速度不如镜像快。之前下载的时候gradle,使用vpn十几秒1M,还不停超时断开连接。而关掉vpn后系统开始使用之前配置好的镜像,一秒几兆,一会儿还下完了。对于一些比较大的使用了vpn也不好下载下来的东西,最好的办法还是能找到支持的镜像。

我觉得,vpn最适合于那种多而散但是每一个都很小的依赖。

另外,有一些vpn会限制访问地址,十分坑人,使用vpn推荐使用老牌厂家的。

没有SSL证书问题解决

在能够看到具体是哪个网站的地址can’t get后,这个问题就比较好解决。

首先用浏览器打开相关网页,一般浏览器是可以打开的,因为Windows的相关证书链是完整的。然后把SSL证书导出。

在Google浏览器中导出可以参考这篇文章:
【图解】谷歌从浏览器中如何导出HTTPS证书?
导出时选择什么导出文件格式是无关紧要的。

导出来的证书推荐放到一块集中存放。
在这里插入图片描述
然后打开Android Studio,点击File->Setting,弹出框中选择Tools->Server Certificates. 点击上面的加号把刚刚导出的证书都添加到Andriod Studio里。

在这里插入图片描述

问题解决

问题的解决过程大概就是把上面那些思路的各种试。

先用Android Studio打开里面的android目录将其当成Android项目来build.

然后提示错误后,如果是证书缺失就开浏览器导证书。

如果是开着vpn下载着失败就关掉vpn用镜像,如果镜像下载着失败就开启vpn用vpn。

这样重复了几次就下载好了所有依赖。

然后运行Android项目,成功运行。

然后重启Andriod Studio,这次直接在Flutter项目目录下打开项目,然后启动Flutter项目,也成功运行。

问题解决。

其他

java的SSL证书链问题的优雅解法是什么呢?

Windows的证书链是完整的,所以可以用浏览器访问各个资源。而很多需要用他们资源的外国公司认为中国发布的证书是不可信任的,所以java经常会报SSLHandshakeException。
参考博客解决Java调用Azure SDK证书错误javax.net.ssl.SSLHandshakeException

也许可以编写一个程序,首先获取到Windows上的各个证书,再编写循环将他们都导入到java里。一次解决问题。
参考博客解决 javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path buildin

也许可以编写一个脚本,每当遇到不可访问的地址,就调用浏览器打开然后导出证书,然后再导入到java里,然后再次执行之前未成功的请求资源指令。不过把这个脚本整合到哪里比较好呢?

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值