Android开发中关于Xwalkview加载https网页出现安全证书ssl问题

大家都知道在URL前加https://前缀表明是用SSL加密的。 你的电脑与服务器之间收发的信息传输将更加安全。

android自带的webview解决方法就不用说了网上很多.

然而https:里面引用诸如HTTP资源就会出现不安全的提示,并页面空白出现Request was denied for security。废话不多说开始进入正题。

 

报这个错误信息的时候就是进入了xwalkview的SslUtil这个工具类,并进了shouldDenyRequest这个方法shouldDenyRequest这个方法

我记得是-200 具体是多少可以打个断点看看,然后怎么解决呢? 下面我们需要替换这个class文件了

首先在自己的工程里面创建一个和这个class文件一样名字java文件把这个class文件的内容ctrl+a ctrl+c 全部拷贝被java文件里面(注意别修改包名路径),然后注释掉你断点跟出来的错误码 就会返还false了,代表不弹这个弹框,当然你也可以全部注释掉,直接返回false,

然后构建工程,这个时候肯定会报错不能成功,但是在你的build目录下就会有一个class文件生成,

好了这个class文件拿到了就好说了,如果你是以依赖3方仓库的形式引入的xwalkview那么需要修改成引入本地xwalkview的方式,这个就直接去下一个aar包,地址:

https://download.01.org/crosswalk/releases/crosswalk/android/maven2/org/xwalk/xwalk_core_library/

然后解压开这个aar包到class.jar也解压

class.jar解压后的org目录下\org\xwalk\core\internal找到SslUtil.calss 用之前生成的这个同名文件替换掉 然后 选中这些文件压缩成jar包

 

然后到

生成新的aar包 就是新的xwalkview代码了,引入项目就可以了 aar包的引入教程链接:

https://jingyan.baidu.com/article/2a13832890d08f074a134ff0.html

还没有完,这个时候 访问有问题的网页 可能会有一个英文弹框,提示用户网页不安全 是否继续访问 用户点击确定后 才能访问.

这个解决方法在XWalkResourceClient的子类中重写这个方法 就没有这个弹框了如下图:

在安卓8.0后 xwalkview还会遇到 需要动态申请联系人权限 的问题,如果没有申请权限 会崩溃 ,很多用户 又怕被偷取隐私

但是 这个权限不给就会奔溃,那么 你可以 用相似的方式修改contacts这个class文件 里面有注册联系人内容观察者的代码前面加上版本判断和是否有权限的判断就好了

 

 
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
Android ,可以通过实现自定义的 `TrustManager` 和 `HostnameVerifier` 来跳过 SSL 证书验证。但是这并不推荐,因为这会降低应用程序的安全性,容易受到间人攻击。 如果您非常确定要跳过证书验证,可以按照以下步骤操作: 1. 创建一个自定义的 `TrustManager`,它将信任所有的 SSL 证书: ``` private TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() { public void checkClientTrusted(X509Certificate[] chain, String authType) {} public void checkServerTrusted(X509Certificate[] chain, String authType) {} public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[0]; } } }; ``` 2. 创建一个自定义的 `SSLSocketFactory`,它使用上一步创建的 `TrustManager`: ``` private SSLSocketFactory getSSLSocketFactory() { try { SSLContext sslContext = SSLContext.getInstance("TLS"); sslContext.init(null, trustAllCerts, new SecureRandom()); return sslContext.getSocketFactory(); } catch (Exception e) { Log.e(TAG, "Failed to create SSL socket factory", e); return null; } } ``` 3. 在您的 HTTP 客户端使用上一步创建的 `SSLSocketFactory`: ``` OkHttpClient client = new OkHttpClient.Builder() .sslSocketFactory(getSSLSocketFactory()) .hostnameVerifier(new HostnameVerifier() { @Override public boolean verify(String hostname, SSLSession session) { return true; } }) .build(); ``` 尽管这个方法可以跳过 SSL 证书验证,但是不建议在生产环境使用。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值