欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 文化 > 【关于高德地图,Mapbox地图加载证书问题】

【关于高德地图,Mapbox地图加载证书问题】

2025/5/2 11:04:25 来源:https://blog.csdn.net/da_caoyuan/article/details/143586651  浏览:    关键词:【关于高德地图,Mapbox地图加载证书问题】

工作中在使用高德和Mapbox地图,遇到了证书问题,大概错误如下:java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
网上查阅了不少资料,这里整理一下有效的解决方案:

高德地图

在使用这个api方法时候:

 fun addMeteorologyLayer(tileUrl: String): TileOverlay {LogUtils.e("tileUrl=$tileUrl")val provider = object : UrlTileProvider(256, 256) {override fun getTileUrl(x: Int, y: Int, zoom: Int): URL {try {var url = tileUrl// 根据瓦片坐标和缩放级别生成对应的 URL 地址url = url.replace("{z}", java.lang.String.valueOf(zoom)).replace("{x}", java.lang.String.valueOf(x)).replace("{y}", java.lang.String.valueOf(y))//Log.i("tileUrl", "getTileUrl: url=$url")return URL(url)} catch (e: MalformedURLException) {e.printStackTrace()}return URL(String.format(tileUrl, x, y, zoom))}}val tileOverlayOptions = TileOverlayOptions().tileProvider(provider).diskCacheEnabled(false).memoryCacheEnabled(true).zIndex(999F)return mAMap.addTileOverlay(tileOverlayOptions)}

由于传进来的tileUrl是自己的公司的地址,https开头,由于证书问题,就会提示文章开头中的错误,解决方案如下:

 private fun handleSSLHandshake() {try {val trustAllCerts: Array<TrustManager> = arrayOf(object : X509TrustManager {override fun checkClientTrusted(chain: Array<out X509Certificate>?, authType: String?) = Unitoverride fun checkServerTrusted(chain: Array<out X509Certificate>?, authType: String?) = Unitoverride fun getAcceptedIssuers(): Array<X509Certificate> = arrayOf()})val sc: SSLContext = SSLContext.getInstance("TLS")// trustAllCerts信任所有的证书sc.init(null, trustAllCerts, SecureRandom())HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory())HttpsURLConnection.setDefaultHostnameVerifier(object : HostnameVerifier {override fun verify(hostname: String?, session: SSLSession?): Boolean {return true}})} catch (ignored: Exception) {ignored.printStackTrace()}}

Mapbox 地图

在使用下面的api方法时:

 fun addWgs84Layer(wgs84title: String) {val tileSet =TileSet.Builder("3.0.0", listOf(wgs84title)).name("Wgs84Layer2").minZoom(0).maxZoom(18).version("2.0.0").scheme(Scheme.XYZ).build()mapboxMap.getStyle { style ->style.addSource(rasterSource("84Layer2") {tileSet(tileSet)tileSize(128L)})style.addLayer(rasterLayer("84Layer2", "84Layer2") {style.getSourceAs<RasterSource>("84Layer2")?.apply {tileNetworkRequestsDelay(0.0)}})}}

由于传进来的tileUrl是自己的公司的地址,https开头,由于证书问题,就会提示文章开头中的错误,解决方案如下:

(1)在res文件夹下新建一个raw 文件夹,将证书xxx_mapbox.der文件放置于此文件夹下。关于证书的获取方法,网上资料很多不在细说。大概是这样:访问你传进来的 tileUrl地址,在浏览器 --》安全–》证书,最后导出你想要的格式即可。
如图:
在这里插入图片描述
(2)在res文件夹下新建xml文件夹,并新增一个xml文件用于配置网络安全参数(即额外证书指向),此处我是用的是network_security_config.xml

<network-security-config><base-config cleartextTrafficPermitted="true"><trust-anchors><certificates src="@raw/xxx_mapbox" /><certificates src="system" /></trust-anchors></base-config>
</network-security-config>

(3)最后一步需要在 AndroidMainifest.xml(主配置) 文件中添加 android:networkSecurityConfig ,表示变更网络配置。

这种方式需要定期更换一下证书文件才行,不过一般一年半载不会更换。也尝试过高德地图上面的处理方法但是不行。

总结

至于为什么会出现这种问题,有说是提供的访问的这个url证书不全导致,等等原因吧。目前我也是没有安全搞明白,有知道的小伙伴欢迎留言评论。


参考文章:
Https证书验证相关;security.cert.CertPathValidatorException: Trust anchor for certification path not found.

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词