栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > .Net

Android 日常开发 (39)javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException:

.Net 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Android 日常开发 (39)javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException:

前言

运维说服务器证书到期了,更新了证书,结果出现了上述问题。

解决方案

通过排查项目代码,发现之前没有做证书信赖验证。这里先提供一个能解决问题但是不是最佳做法的方案,方便大家快速处理问题

项目使用了okhttp
通过对okhttp的builder添加证书校验

OkHttpClient.Builder builder
SSLContext sslContext = SSLContextUtil.getDefaultSLLContext();
  if (sslContext != null) {
      SSLSocketFactory socketFactory = sslContext.getSocketFactory();
      builder.sslSocketFactory(socketFactory);
  }
  builder.hostnameVerifier(SSLContextUtil.HOSTNAME_VERIFIER);

SSLContextUtil工具类

package cn.droidlover.xdroidmvp.net;

import java.security.SecureRandom;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;

import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;


public class SSLContextUtil {

  
  public static SSLContext getDefaultSLLContext() {
    SSLContext sslContext = null;
    try {
      sslContext = SSLContext.getInstance("TLS");
      sslContext.init(null, new TrustManager[] {trustManagers}, new SecureRandom());
    } catch (Exception e) {
      e.printStackTrace();
    }
    return sslContext;
  }

  
  private static TrustManager trustManagers = new X509TrustManager() {

    @Override
    public void checkClientTrusted(X509Certificate[] chain, String authType)
        throws CertificateException {}

    @Override
    public void checkServerTrusted(X509Certificate[] chain, String authType)
        throws CertificateException {

    }

    @Override
    public X509Certificate[] getAcceptedIssuers() {
      return new X509Certificate[0];
    }
  };

  
  public static final HostnameVerifier HOSTNAME_VERIFIER = new HostnameVerifier() {
    public boolean verify(String hostname, SSLSession session) {
      return true;
    }
  };

}

上面的方法虽然能快速帮你解决因为证书问题无法请求服务器接口,但是还是不够的,后面的文章,将会给大家正确的姿势讲解

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/909833.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号