Android Https证书过期解决方案
2022.11.08 18:09:12
应该有很多小伙伴遇到这样一个问题,在线上已发布的app里,关于https的cer证书过期,从而导致app所有网络请求失效无法使用。
这个时候有人就要说了,应急发布一个已更新最新cer证书的apk不就完事了么,其实没那么简单,iOS还好可以通过appstore提供的api查询到新版本,但android就不一样了,需要调用自己Server端提供的api接口查询到新版本,并获取apk下载路径,问题是https都不能访问了,如何请求到版本信息呢?
博主在这里提供2种解决方案
方案一:将版本信息接口让后台改成http(不推荐,后台因素不可控),或者将本地https的设置一个不安全校验(推荐),代码如下:
private static OkHttpClient newOkHttpClient(int timeout){HttpLoggingInterceptor logging = new HttpLoggingInterceptor();logging.setLevel(HttpLoggingInterceptor.Level.BODY);return new OkHttpClient.Builder().addInterceptor(new RequestInfoInterceptor())//.addInterceptor(logging).addNetworkInterceptor(new TokenHeaderInterceptor()).sslSocketFactory(Certificate.getSSLSocketFactory())//设置不安全校验.hostnameVerifier(Certificate.getUnSafeHostnameVerifier()).readTimeout(timeout, TimeUnit.SECONDS).writeTimeout(timeout, TimeUnit.SECONDS).build();}/***获取HostnameVerifier */public static HostnameVerifier getUnSafeHostnameVerifier() {HostnameVerifier hostnameVerifier = new HostnameVerifier() {@Overridepublic boolean verify(String s, SSLSession sslSession) {return true;}};return hostnameVerifier;}
方案二:将xxx.cer证书改成动态读取(以文件的方式从app沙盒里面读取即可),在https证书即将过期时,从服务器下载最新的cer证书更新到沙盒里面,App每次初始化网络请求时读取sdcard最新的证书文件,这样App就永远不会出现https证书过期导致无法使用的问题,流程图如下:
image.png
这里粘贴关键设置cer证书的代码
private static OkHttpClient newOkHttpClient(int timeout){HttpLoggingInterceptor logging = new HttpLoggingInterceptor();logging.setLevel(HttpLoggingInterceptor.Level.BODY);return new OkHttpClient.Builder().addInterceptor(new RequestInfoInterceptor())//.addInterceptor(logging).addNetworkInterceptor(new TokenHeaderInterceptor()).sslSocketFactory(Certificate.getSSLSocketFactory(BaseApplcation.myApp, new String[]{"/sdcard/xxx.cer"})).hostnameVerifier(Certificate.getUnSafeHostnameVerifier()).readTimeout(timeout, TimeUnit.SECONDS).writeTimeout(timeout, TimeUnit.SECONDS).build();}/*** 带证书的,从本地文件读取* @param context* @param certificatesFiles 本地文件(通过下载到本地)* @return*/public static SSLSocketFactory getSSLSocketFactory(Context context, String[] certificatesFiles) {if (context == null) {throw new NullPointerException("context == null");}CertificateFactory certificateFactory;try {certificateFactory = CertificateFactory.getInstance("X.509");KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());keyStore.load(null, null);for (int i = 0; i < certificatesFiles.length; i++) {InputStream certificate = new FileInputStream(certificatesFiles[i]);keyStore.setCertificateEntry(String.valueOf(i), certificateFactory.generateCertificate(certificate));if (certificate != null) {certificate.close();}}SSLContext sslContext = SSLContext.getInstance("TLS");TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());trustManagerFactory.init(keyStore);sslContext.init(null, trustManagerFactory.getTrustManagers(), new SecureRandom());return sslContext.getSocketFactory();} catch (Exception e) {}return null;}/*** 带证书的,从raw资源中读取* @param context* @param certificates rawIds* @return*/public static SSLSocketFactory getSSLSocketFactory(Context context, int[] certificates) {if (context == null) {throw new NullPointerException("context == null");}CertificateFactory certificateFactory;try {certificateFactory = CertificateFactory.getInstance("X.509");KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());keyStore.load(null, null);for (int i = 0; i < certificates.length; i++) {InputStream certificate = context.getResources().openRawResource(certificates[i]);keyStore.setCertificateEntry(String.valueOf(i), certificateFactory.generateCertificate(certificate));if (certificate != null) {certificate.close();}}SSLContext sslContext = SSLContext.getInstance("TLS");TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());trustManagerFactory.init(keyStore);sslContext.init(null, trustManagerFactory.getTrustManagers(), new SecureRandom());return sslContext.getSocketFactory();} catch (Exception e) {}return null;}
总结一下,方案一需要App升级解决证书过期问题,方案二无需升级即可解决升级问题,小伙伴们,设置证书用哪种方式,心里有答案了吧。
代码虽简单,就当做个笔记。
Android Https证书过期解决方案相关推荐
- Android https证书过期,Android 的 HTTPS 证书过期异常
8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 对于 HTTPS 服务器证书过期的问题,由于 Android 安全库的不断更新,尽管在证书验证的时候抛出的异常大同小异, ...
- VNX证书过期解决方案(2018-11-02)
VNX证书过期解决方案(2018-11-02) 参考文章: (1)VNX证书过期解决方案(2018-11-02) (2)https://www.cnblogs.com/xiaorongjie/p/11 ...
- kubeadm 安装kubernetes kube-api证书过期解决方案
kubeadm 安装kubernetes kube-api证书过期解决方案 problem describection Unable to connect to the server: x509: c ...
- emc存储java过期,干货来了!VNX证书过期解决方案,再也不怕VXN证书过期了!
干货来了!VNX证书过期解决方案,再也不怕VXN证书过期了! 2018-11-02 VNX证书过期了怎么办?北京纳恩恒泰为您准备了以下详细步骤: 1. Web访问VNX Unisphere管理,提示证 ...
- 使用zabbix-agent2自定义插件获取https证书过期时间
需求 对经常维护网站的人来说,要经常跟https的证书打交道.一般https证书的有效期是一年,证书一旦过期,公司的损失会非常大.去年网易邮箱因为https证书忘记续期,导致大量用户无法正常使用邮箱就 ...
- curl证书过期_centos7内核升级及curl访问https证书过期处理
centos7内核升级及curl访问https证书过期处理 先看下当前系统的linux内核版本 uname -r 3.10.0-229.el7.x86_64 升级步骤 1.rpm --import h ...
- https证书过期时间应该怎么处理
在遇到问题的时候,我们首先应该想到的是如何去解决这个问题,而且对于问题的解决方式也应该有一定的了解,或者说是出现这个问题的时候会有一个什么样的结果呈现,了解了这两种情况之后我们才能结合具体的问题进行解 ...
- https 证书过期问题排查
一.问题描述 在服务协议由 http 迁移至 https 时,我发现线上环境报错 javax.net.ssl.SSLHandshakeException: sun.security.validator ...
- HTTPS证书过期|SSL证书过期 |华硕路由器| NAS|Certtificate is not valid
1.问题描述 使用DDNS 访问内网的nas时,会有个https的证书问题. 可以用let's encrypt的免费证书解决.但是三个月到期之后需要续签,不然谷歌浏览器chrome会提示风险: You ...
最新文章
- 云脑人力资源管理软件EHR选型手记(即时连载)
- Matlab直线一级倒立摆控制方法研究
- python输入水果数量_Python 水果统计
- linux修改ssh登陆端口号,Linux 6 修改ssh默认远程端口号的操作步骤
- 传说之下地图素材_文旅黄陵——轩辕黄帝传说故事(十一) 杜康酿酒的传说...
- 跟着邓神 3 天掌握 Go 语言基础(免费)
- leetcode 779. K-th Symbol in Grammar | 779. 第K个语法符号(Java)
- SAP系统和微信集成的系列教程之三:微信用户关注公众号之后,自动在SAP C4C系统创建客户主数据
- Java中的策略设计模式-示例教程
- Micrium/UCOS官网账号密码重新改问题
- linux管道通信题目,操作系统实训(Linux)——习题解答、例题解析、实验指导-王红-实验实验7软中断及管道通信课案.ppt...
- laydate报Uncaught TypeError: Cannot read property 'appendChild' of undefined
- 易筋SpringBoot2.1 | 第二篇:Spring Boot配置文件详解
- ubuntu上的翻译软件,看论文神器
- UE4官方文档阅读笔记——编程指南
- ubuntu下研华工控机CAN卡驱动的安装与测试
- AC/DC、DC/DC转换器基础指南(二)
- 通达OA系统管理员操作手册
- SuperMap云许可配置
- Google Play 管理中心新增战略指南,助力游戏收入增长
热门文章
- 计算机转行学汽修,维修行业也出现用工荒,很多同行已经改行,年轻人不愿意学修车!...
- POC编写基础————1、基础知识
- Javascript高级编程学习笔记(20)—— 创建对象
- sql.gz还原mysql_mysql 数据备份还原
- 苹果x如何截屏_果粉请注意!苹果手机也能截长图了,原来iPhone截屏还能这样玩!...
- Java学习 day37_JSDOM
- 大伦育儿说01 孩子舌形很尖
- 大数据技术之_23_Python核心基础学习_01_计算机基础知识 + Python 入门 (9.5小时)
- 软件乱码和中文路径识别不了问题
- win10安装ubuntu16.04双系统详解