Flutter Android模拟器运行报SSLHandshakeException PKIX路径构建失败
Flutter Android端构建报SSL握手证书路径校验失败问题
问题描述
Flutter默认应用在Web端运行正常,在Android模拟器上运行时报错,尝试检索到的公开方案后均未解决问题。
运行环境:Windows 10,Android模拟器为Pixel XL API 30,同环境下非Flutter原生Android项目可正常在该模拟器运行。
已尝试的无效方案
- 方案1:切换至手机移动网络
- 方案2:修改
gradle-wrapper.properties配置文件中的distributionUrl地址,将https替换为http,配置如下:
distributionUrl=http\://services.gradle.org/distributions/gradle-7.4-all.zip
- 方案3:下载jcenter站点的SSL证书并添加到Java信任库
- 方案4:在
gradle.properties配置文件中添加信任库配置:
systemProp.javax.net.ssl.trustStore=[PATH_TO_TRUST_STORE] systemProp.javax.net.ssl.trustStorePassword=[PASSWORD] (changeit)
错误堆栈
Exception in thread "main" javax.net.ssl.SSLHandshakeException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target at java.base/sun.security.ssl.Alert.createSSLException(Alert.java:131) at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:349) at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:292) at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:287) at java.base/sun.security.ssl.CertificateMessage$T13CertificateConsumer.checkServerCerts(CertificateMessage.java:1357) at java.base/sun.security.ssl.CertificateMessage$T13CertificateConsumer.onConsumeCertificate(CertificateMessage.java:1232) at java.base/sun.security.ssl.CertificateMessage$T13CertificateConsumer.consume(CertificateMessage.java:1175) at java.base/sun.security.ssl.SSLHandshake.consume(SSLHandshake.java:392) at java.base/sun.security.ssl.HandshakeContext.dispatch(HandshakeContext.java:443) at java.base/sun.security.ssl.HandshakeContext.dispatch(HandshakeContext.java:421) at java.base/sun.security.ssl.TransportContext.dispatch(TransportContext.java:182) at java.base/sun.security.ssl.SSLTransport.decode(SSLTransport.java:172) at java.base/sun.security.ssl.SSLSocketImpl.decode(SSLSocketImpl.java:1426) at java.base/sun.security.ssl.SSLSocketImpl.readHandshakeRecord(SSLSocketImpl.java:1336) at java.base/sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:450) at java.base/sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:421) at java.base/sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:572) at java.base/sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:197) at java.base/sun.net.www.protocol.http.HttpURLConnection.followRedirect0(HttpURLConnection.java:2787) at java.base/sun.net.www.protocol.http.HttpURLConnection.followRedirect(HttpURLConnection.java:2699) at java.base/sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1854) at java.base/sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1520) at java.base/sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:250) at org.gradle.wrapper.Download.downloadInternal(Download.java:58) at org.gradle.wrapper.Download.download(Download.java:44) at org.gradle.wrapper.Install$1.call(Install.java:61) at org.gradle.wrapper.Install$1.call(Install.java:48) at org.gradle.wrapper.ExclusiveFileAccessManager.access(ExclusiveFileAccessManager.java:65) at org.gradle.wrapper.Install.createDist(Install.java:48) at org.gradle.wrapper.WrapperExecutor.execute(WrapperExecutor.java:128) at org.gradle.wrapper.GradleWrapperMain.main(GradleWrapperMain.java:61)
可行解决方案
错误发生在Gradle Wrapper启动阶段下载Gradle发行包的环节,和Flutter代码、模拟器配置无关。此前方案无效的核心原因是证书导入了错误的Java运行环境,或Gradle强制HTTPS跳转导致http配置失效,按以下步骤操作:
- 定位Flutter实际使用的JDK路径
终端执行flutter doctor -v,找到输出项Java binary at:对应的JRE目录,此前导入证书若操作的是自行安装的其他JDK,不会对Flutter构建生效。 - 跳过Gradle在线下载步骤
手动下载gradle-7.4-all.zip压缩包,放到Windows本地Gradle缓存路径:C:\Users\[当前系统用户名]\.gradle\wrapper\dists\gradle-7.4-all\[随机命名的子目录]\,压缩包无需解压,Gradle Wrapper检测到本地存在匹配版本的安装包时会直接加载,完全跳过网络下载环节,从根源避免SSL握手错误。 - 修正依赖源配置
打开项目下android/build.gradle文件,将repositories块中已停止服务的jcenter源替换为国内可正常访问的公共maven源,避免后续依赖下载阶段出现同类证书问题。 - 清理缓存重新构建
依次执行flutter clean、flutter pub get,再执行flutter run即可正常启动项目。
如果操作后仍有报错,直接用Android Studio打开项目的android子目录,等待Gradle自动同步完成后,再回到终端执行Flutter运行命令,Android Studio会自动完成Gradle环境适配。
内容的提问来源于stack exchange,提问作者Akanksha Saini
相关产品推荐
相关产品推荐

