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证书过期解决方案相关推荐

  1. Android https证书过期,Android 的 HTTPS 证书过期异常

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 对于 HTTPS 服务器证书过期的问题,由于 Android 安全库的不断更新,尽管在证书验证的时候抛出的异常大同小异, ...

  2. VNX证书过期解决方案(2018-11-02)

    VNX证书过期解决方案(2018-11-02) 参考文章: (1)VNX证书过期解决方案(2018-11-02) (2)https://www.cnblogs.com/xiaorongjie/p/11 ...

  3. kubeadm 安装kubernetes kube-api证书过期解决方案

    kubeadm 安装kubernetes kube-api证书过期解决方案 problem describection Unable to connect to the server: x509: c ...

  4. emc存储java过期,干货来了!VNX证书过期解决方案,再也不怕VXN证书过期了!

    干货来了!VNX证书过期解决方案,再也不怕VXN证书过期了! 2018-11-02 VNX证书过期了怎么办?北京纳恩恒泰为您准备了以下详细步骤: 1. Web访问VNX Unisphere管理,提示证 ...

  5. 使用zabbix-agent2自定义插件获取https证书过期时间

    需求 对经常维护网站的人来说,要经常跟https的证书打交道.一般https证书的有效期是一年,证书一旦过期,公司的损失会非常大.去年网易邮箱因为https证书忘记续期,导致大量用户无法正常使用邮箱就 ...

  6. curl证书过期_centos7内核升级及curl访问https证书过期处理

    centos7内核升级及curl访问https证书过期处理 先看下当前系统的linux内核版本 uname -r 3.10.0-229.el7.x86_64 升级步骤 1.rpm --import h ...

  7. https证书过期时间应该怎么处理

    在遇到问题的时候,我们首先应该想到的是如何去解决这个问题,而且对于问题的解决方式也应该有一定的了解,或者说是出现这个问题的时候会有一个什么样的结果呈现,了解了这两种情况之后我们才能结合具体的问题进行解 ...

  8. https 证书过期问题排查

    一.问题描述 在服务协议由 http 迁移至 https 时,我发现线上环境报错 javax.net.ssl.SSLHandshakeException: sun.security.validator ...

  9. HTTPS证书过期|SSL证书过期 |华硕路由器| NAS|Certtificate is not valid

    1.问题描述 使用DDNS 访问内网的nas时,会有个https的证书问题. 可以用let's encrypt的免费证书解决.但是三个月到期之后需要续签,不然谷歌浏览器chrome会提示风险: You ...

最新文章

  1. 云脑人力资源管理软件EHR选型手记(即时连载)
  2. Matlab直线一级倒立摆控制方法研究
  3. python输入水果数量_Python 水果统计
  4. linux修改ssh登陆端口号,Linux 6 修改ssh默认远程端口号的操作步骤
  5. 传说之下地图素材_文旅黄陵——轩辕黄帝传说故事(十一) 杜康酿酒的传说...
  6. 跟着邓神 3 天掌握 Go 语言基础(免费)
  7. leetcode 779. K-th Symbol in Grammar | 779. 第K个语法符号(Java)
  8. SAP系统和微信集成的系列教程之三:微信用户关注公众号之后,自动在SAP C4C系统创建客户主数据
  9. Java中的策略设计模式-示例教程
  10. Micrium/UCOS官网账号密码重新改问题
  11. linux管道通信题目,操作系统实训(Linux)——习题解答、例题解析、实验指导-王红-实验实验7软中断及管道通信课案.ppt...
  12. laydate报Uncaught TypeError: Cannot read property 'appendChild' of undefined
  13. 易筋SpringBoot2.1 | 第二篇:Spring Boot配置文件详解
  14. ubuntu上的翻译软件,看论文神器
  15. UE4官方文档阅读笔记——编程指南
  16. ubuntu下研华工控机CAN卡驱动的安装与测试
  17. AC/DC、DC/DC转换器基础指南(二)
  18. 通达OA系统管理员操作手册
  19. SuperMap云许可配置
  20. Google Play 管理中心新增战略指南,助力游戏收入增长

热门文章

  1. 计算机转行学汽修,维修行业也出现用工荒,很多同行已经改行,年轻人不愿意学修车!...
  2. POC编写基础————1、基础知识
  3. Javascript高级编程学习笔记(20)—— 创建对象
  4. sql.gz还原mysql_mysql 数据备份还原
  5. 苹果x如何截屏_果粉请注意!苹果手机也能截长图了,原来iPhone截屏还能这样玩!...
  6. Java学习 day37_JSDOM
  7. 大伦育儿说01 孩子舌形很尖
  8. 大数据技术之_23_Python核心基础学习_01_计算机基础知识 + Python 入门 (9.5小时)
  9. 软件乱码和中文路径识别不了问题
  10. win10安装ubuntu16.04双系统详解